У меня проблема с пустыми файлами 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();
}