Как исправить случайное удаление файлов cookie (нулевых) между Delphi и Java? - PullRequest
3 голосов
/ 20 мая 2019

У меня проблема с пустыми файлами cookie, полученными на моем бэкэнде Java, когда я вижу, что они не равны NULL и передаются из моего Delphi, Indy10, внешнего интерфейса. Это происходит не каждый раз. Обратные вызовы могут потерпеть неудачу, как и вызовы в цикле, но не все из них. Они будут работать просто отлично. Затем сервер будет жаловаться на множественные вызовы, говоря, что у них нулевой файл cookie. Затем после этого он снова начнет работать. Файл cookie - это тот же менеджер файлов cookie, перед отправкой он не имеет значения NULL и время его ожидания не истекло.

//Delphi psuedo code for loop every 4 seconds since it is not unreasonable to have a call to the back end within 4 seconds of each other.

loop every 4 seconds
begin
  url := 'serverPath/someCall';
  ResponseStream := TStringStream.Create;
  IdHTTP := TIdHTTP.Create;

  LogDebug := TIdLogDebug.Create(nil);
  IdHTTP.Intercept := LogDebug;
  TIdLogDebug(IdHTTP.Intercept).Active := True;

  IdCompressor := TIdCompressorZLib.Create(IdHTTP);
  IdHTTP.Compressor := IdCompressor;
  IdHTTP.AllowCookies := True;
  IdHTTP.CookieManager := GetTheGlobalCookieManager;
  LogCookies(IdHTTP.CookieManager); //Edited
  try
  //PROBLEM HERE
    IdHTTP.Get(url, ResponseStream);  //The Cookie (sessionid) always looks VALID here.
                                      //But SOMETIMES the server says it is null and
                                      //throws an exception.
    S := ResponseStream.DataString;

  except
    PostTheException;
  end;

  //Do Stuff with S

  IdHTTP.Compressor.Free;
  IdHTTP.Compressor := nil;
  IdHTTP.Free;
  ResponseStream.Free;
end;

New

procedure LogCookies(CM: TIdCookieManager);
var
  Cookies: TIdCookieList;
  I: Integer;
  Cookie: TIdCookie;
begin
  try
    Cookies := CM.CookieCollection.LockCookieList(caRead);

    for I := 0 to Cookies.Count - 1 do
    begin
      Cookie := Cookies[I];
      OutputDebugString(PChar('Client Cookie: ' + Cookie.ClientCookie));
      OutputDebugString(PChar('Cookie Name: ' + Cookie.CookieName));
      OutputDebugString(PChar('Cookie Text: ' + Cookie.CookieText));
      OutputDebugString(PChar('Server Cookie: ' + Cookie.ServerCookie));
    end;
  finally
    CM.CookieCollection.UnlockCookieList(caRead);
  end;
end;

Выход LogCookies:

[14900] Client Cookie: session=9E6A18164750844AB41C0FE76D0BE3BB
[14900] Cookie Name: session
[14900] Cookie Text: session=9E6A18164750844AB41C0FE76D0BE3BB; Path=/; Domain=127.0.0.1; Max-Age=899; Expires=Tue, 21-May-2019 14:10:25 GMT
[14900] Server Cookie: session=9E6A18164750844AB41C0FE76D0BE3BB; Path=/; Domain=127.0.0.1; Max-Age=899; Expires=Tue, 21-May-2019 14:10:25 GMT

Серверная часть Java

    @GET
    @Path("someCall")
    @Produces(MediaType.APPLICATION_JSON)
    public Response subscribeInstanceES(
            @CookieParam("session") String sessionId,
            @QueryParam("id") List<Integer> idList) {
        if (sessionId == null)             //The session is null right here
          throw new IllegalArgumentException("Invalid session: " + sessionId);
        ...More security checks
        ...Due the  work

//The original Cookie is gotten on login, this is a refresher   
       NewCookie cookie = new NewCookie("session", sessionID, "/", "", "", 
900, false);
        return Response.status(200).cookie(cookie).entity("true").build();
    }
...