2012-04-23 13 views
1

私はIndy TIdHTTPと一緒にTIdCookieManagerを使用しています。私は、送信しようとしているリクエストの現在のクッキーをチェックし、それが有効である可能性を確認したい(私は100%サーバーが私のリクエストを受け入れることができないことを知っている)。クッキーがない場合、または有効期限が切れている場合は、まずログインして新しいクッキーを取得します。それ以外の場合は、リクエストを送信してください。TIdHTTP:要求を送信する前に有効なCookieがあるかどうかを確認しますか?

このような小切手はどうやって行うのですか?私はリクエストを送信する前にクッキーマネージャーをチェックする必要があると思うが、何をチェックすべきか分からない。

+0

実際のページをリクエストし、コンテンツが自認のウェブページまたは何らかのエラーメッセージと一致するかどうかを確認する必要があります。それはサーバーがあなたのクッキーを受け入れているのを見ることができる唯一の方法です;) – opc0de

+0

クッキーの有効性をチェックすることはできません。それはサーバーのタスク/責任です。クッキーは暗号化されて無駄なものになる可能性があります。 – whosrdaddy

+1

いいえ、クッキーが期限切れになっているかどうかは確認できます。 'TIdCookieManager'にリクエストを送るURLのクッキーのリストを問い合わせ、実際にクッキーがリストに含まれているかどうか確認できます。 –

答えて

2

はこのような何かを試してみてください。

if not CheckCookies(IdHTTP1.CookieManager, 'http://www.someurl.com/') then 
begin 
    // login and get new cookies ... 
end; 
+0

まだ試したことはありませんが、 'CheckCookies()'ではなく、 'CheckCookies()'ではないはずはありませんか?実際には、実際には意図された使用に依存している、私はおそらく両方のイベントを処理する必要があります。 –

+0

私は、再ログインして新しいクッキーを取得する部分が '...'であると仮定していました。私はそれに応じて私の答えを更新しました。 –

1

コメントで既に述べたように、クライアントで実際に受け入れ検査を実行することはできません。サーバーだけがそれを行うことができます。あなたは除外することができますしかし

有効期限が切れたか、または無効クッキー:

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; 

機能が無効なクッキーを削除し、左有効なものが存在しない場合はFalseを返します。

if (Assigned(con.CookieManager)) then 
    filterInvalidCookies(con.CookieManager.CookieCollection, 
    TIdURI.Create('http://www.someurl.com/')); 

conTIdHTTPオブジェクトです。このような要求の前にそれを呼び出します。

追加の、おそらくターゲットとするページ固有のチェックを行うことができます。

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; 

+2

期限切れのクッキーを削除する簡単な方法があります。 'TIdCookieManager.GenerateClientCookies()'メソッドを呼び出してください。有効期限が切れたクッキーを削除してから、一致するリファイニングクッキーを出力リストに入力します。 'TIdCookieManager'の将来のリリースでは、クッキー管理をより詳細に制御するためのいくつかの新しいメソッド(' RemoveExcessCookies() '、' RemoveExpiredCookies() '、' RemoveNonPersistentCookies() ')があります。 –

+0

良い解決策のように見えますが、私が必要とするのは、特定のCookieが存在するかどうか、また有効期限が切れていないかどうかを確認することだけです。私は必ずしもそれらを削除する必要はありませんが、私はそれが助けると確信しています。 –

関連する問題