2012-01-27 173 views
6

我必須瀏覽某個網站,該網站使用indy的idhttp保留會話ID。indy的會話cookie

我使用下面的代碼初始化我需要的組件。

procedure InitSession; 
begin 
    Initalized := True; 
    try 
    ihttp := TIdHTTP.Create(nil); //the variables are declared globally 
    idCookie := TIdCookieManager.Create(nil); 
    ihttp.ConnectTimeout := 5000; 
    ihttp.AllowCookies := true; 
    ihttp.HandleRedirects := true; 
    ihttp.CookieManager := idCookie; 
    except 
    Initalized := False; 
    end; 
end; 

問題是,當我提出請求的cookie不發送。我需要做什麼才能發送cookie巫婆包含會話ID。謝謝

+1

您需要指定您正在使用的Indy版本,因爲功能在版本之間發生了變化(有時是顯着的)。因此,如何做事情也會發生巨大變化。 – 2012-01-28 00:47:51

+1

我建議嘗試Subversion的當前Indy版本或每日快照 – mjn 2012-01-29 13:55:09

回答

6

如果一個cookie沒有被髮送回新的請求,那麼任何一個TIdCookieManager都會在收到cookie時拒絕cookie,或者不會將接受的cookie與新請求匹配。您能否顯示發送cookie的實際Set-Cookie響應標題,以及您認爲cookie未被正確發回的URL?您是否在收到Cookie後驗證其是否在發送新請求之前實際結束於TIdCookieManager

您使用哪個版本的Indy?在2011年之前,Indy 10的早期版本確實破壞了基本上無法使用的cookie處理。但在2011年初,IdCookieManager.pasIdCookie.pas完全重新編寫,自2011年5月起開始正常工作,我還沒有看到任何新的cookie處理不當的報告。

+0

我正在使用Delphi XE 2 ...所以當我使用ihttp.Get()方法時,Cookie應該自動發送還是我必須手動設置? Cookie在Cookie管理器中正確收到。我該怎麼做,謝謝? – opc0de 2012-01-28 11:44:18

+0

我試了這個ihttp.Request.CustomHeaders.Add('Cookie:'+ idcookie.CookieCollection.Cookies [0] .ClientCookie); 但沒有成功 – opc0de 2012-01-28 13:21:07

+0

Cookie自動處理。同樣,服務器的「Set-Cookie」頭看起來像是在接收cookie?您可以從'TIdHTTP.Response.RawHeaders'屬性中獲取該值。您之後請求的是不是將Cookie發送回去的URL?我需要這些信息來確定Indy是否正確運行,或者這是否是重新設計的Cookie管理代碼中的錯誤。 – 2012-01-29 23:09:42

0

對於沒有DOMAIN屬性的cookie有問題嗎? DXE2附帶的IdCookie無法解析沒有MAX-AGE屬性的Cookie,請確保具有EXPIRES屬性,並且沒有DOMAIN屬性。請參閱IdCookie.pas 675,其中S似乎具有意想不到的值(從解析expires屬性留下)。