1

我正在使用 IndyTIdHTTPTIdCookieManager. 我想检查我即将发送的请求的当前 cookie,并确定它有效的可能性(我知道我不能 100% 确定服务器会接受我的请求)。如果没有 cookie,或者它们已过期,我将首先登录并获取新的 cookie。否则,只需发送请求。

我将如何进行这样的检查?我相信我必须在发送请求之前检查 cookie 管理器,但不知道要检查什么。

4

2 回答 2

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;
于 2012-04-23T23:37:23.957 回答
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

当然,您可以进行额外的,也许是针对特定页面的检查。

于 2012-04-23T13:50:08.400 回答