我有一个桌面应用程序(使用Delphi XE2开发)登录并与PHP 5 Web 应用程序交互(我使用CodeIgniter 2.1和TankAuth - 都是最新版本)
TankAuth似乎具有会话过期功能(每 5 分钟启动一次)以防止会话劫持。这是一个很好的安全措施,但是...
这也使 Delphi 应用程序登录无效。更具体地说,我需要更新 cookie(我使用 Indy 10.4861),这意味着我必须每 5 分钟重新登录一次
我的 Delphi XE2 应用程序使用多线程。我使用全局 cookie(以避免登录每个线程!),所以我必须解决每 5 分钟锁定一次以重新登录。
我的分析器清楚地表明我需要对此做点什么!
我的代码如下所示:
TheResponse := TStringStream.Create;
try
IdHttp.Get(TheURL, TheResponse);
if (TheResponse <> nil) And (Pos('login', TheResponse.DataString) <> 0) then
begin
OmniLock.Acquire;
try
LoginToServer(ServerLogin, UserPassword);
finally
OmniLock.Release;
end; // try/finally
// Reload local copie of the cookies manager
OmniLock.Acquire;
try
TheCookieManager.AddCookies(GlobalCookieManager);
finally
OmniLock.Release;
end; // try/finally
except
// ...
end; // try/except
我的问题是:有没有办法让会话过期,但以某种方式捕获更改的会话过期并更新 cookie 管理器而无需重新登录?
编辑
每当有新的 cookie 时,全局 cookie 管理器就会更新:
idHTTP.OnNewCookie := SyncNewCookie;
// ------------------------------------------------------------------------------ //
procedure TMainForm.SyncNewCookie(ASender : TObject; ACookie : TIdCookie; var VAccept : Boolean);
begin
VAccept := True;
OmniLock.Acquire;
try
GlobalCookieManager.CookieCollection.AddServerCookie(ACookie.ServerCookie, TIdHTTP(TIdCookieManager(ASender).Owner).URL);
finally
OmniLock.Release;
end; // try/finally
end;