TIdHTTP:在发送请求之前检查有效的cookie?

时间:2012-04-23 10:05:20

标签: delphi cookies delphi-xe2 indy idhttp

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

我该怎么做这样的检查?我相信在发送请求之前我必须检查cookie管理器,但不知道要检查什么。

2 个答案:

答案 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/'));

其中conTIdHTTP个对象。

当然,您可以执行其他目标页面特定检查。