我有一个桌面应用程序(使用 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;