我正在使用Indy TIdHTTP
和TIdCookieManager
。我想查看我即将发送的请求的当前cookie,并确定它有效的可能性(我知道我不能100%确定服务器将接受我的请求)。如果没有cookie,或者它们已过期,我将首先登录并获取新的cookie。否则,只需发送请求。
我该怎么做这样的检查?我相信在发送请求之前我必须检查cookie管理器,但不知道要检查什么。
答案 0 :(得分:2)
尝试这样的事情:
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;
答案 1 :(得分:1)
如同评论中已经说明的那样,您无法在客户端上执行实际的验收检查,只有服务器才能这样做。
但是,您可以过滤掉过期或无效的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
个对象。
当然,您可以执行其他目标页面特定检查。