2012-01-27 176 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属性留下)。