I have a desktop app (developed with Delphi XE2) that login & interacts with a PHP 5 web application (I use CodeIgniter 2.1 along with TankAuth - both latest version)
Кажется, что TankAuth имеет функцию истечения сеанса (которая пинает каждые 5 минут ), чтобы предотвратить захват сеанса. Это хорошая мера безопасности, но ...
This also invalidate the Delphi application login. More specifically, I need to update cookies (I use Indy 10.4861), which means I have to re-login every 5 minutes
Приложение My 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
My question is: Is there a way to keep the session expire, but somehow capture the changed session expire and update the cookie manager without having to re-login?
<Сильный> ИЗМЕНИТЬ
Глобальный менеджер файлов 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;