我正在使用 IndyTIdHTTP
和TIdCookieManager
. 我想检查我即将发送的请求的当前 cookie,并确定它有效的可能性(我知道我不能 100% 确定服务器会接受我的请求)。如果没有 cookie,或者它们已过期,我将首先登录并获取新的 cookie。否则,只需发送请求。
我将如何进行这样的检查?我相信我必须在发送请求之前检查 cookie 管理器,但不知道要检查什么。
我正在使用 IndyTIdHTTP
和TIdCookieManager
. 我想检查我即将发送的请求的当前 cookie,并确定它有效的可能性(我知道我不能 100% 确定服务器会接受我的请求)。如果没有 cookie,或者它们已过期,我将首先登录并获取新的 cookie。否则,只需发送请求。
我将如何进行这样的检查?我相信我必须在发送请求之前检查 cookie 管理器,但不知道要检查什么。
尝试这样的事情:
function CheckCookies(Cookies: TIdCookieManager; const TargetURL: String): Boolean;
var
URL: TIdURI;
Headers: TIdHeaderList;
begin
Result := False;
URL := TIdURI.Create(TargetURL);
try
Headers := TIdHeaderList.Create(QuoteHTTP);
try
Cookies.GenerateClientCookies(URL, False, Headers);
Result := Headers.Count > 0;
finally
Headers.Free;
end;
finally
URL.Free;
end;
end;
.
if not CheckCookies(IdHTTP1.CookieManager, 'http://www.someurl.com/') then
begin
// login and get new cookies ...
end;
就像评论中已经说明的那样,您不能在客户端上执行实际的验收检查,只有服务器可以这样做。
但是,您可以过滤掉过期或无效的 cookie:
function filterInvalidCookies(cookies: TIdCookies; targetURL: TIdURI): Boolean;
var
c: Integer;
begin
Result := False;
c := 0;
while (cookies.Count > c) do
if (not cookies[c].IsExpired and cookies[c].IsAllowed(targetURL, False) and
(cookies[c].CookieName <> '')) then
begin
Result := True;
Inc(c);
end
else
cookies.Delete(c);
end;
该函数会删除无效的 cookie,如果没有有效的 cookie,则返回 False。在这样的请求之前调用它:
if (Assigned(con.CookieManager)) then
filterInvalidCookies(con.CookieManager.CookieCollection,
TIdURI.Create('http://www.someurl.com/'));
con
对象在哪里TIdHTTP
。
当然,您可以进行额外的,也许是针对特定页面的检查。