1

TIdHTTPと一緒にIndyを使っていTIdCookieManagerます。送信しようとしているリクエストの現在の 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 に答える