0

我有一个桌面应用程序(使用Delphi XE2开发)登录并与PHP 5 Web 应用程序交互(我使用CodeIgniter 2.1TankAuth - 都是最新版本)

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;
4

0 回答 0