想实现的功能是,先登录上该网站,然后以登录的用户身份去浏览该网站的其它内容。此前问过该问题,再叙述一遍,装了Indy 10, 
用IdHTTP.post() 返回的结果是connection closed gracefully,
只得用IdHTTP.get(),显示登录成功。为IdHTTP添加了一个IdCookieManager, 在IdCookieManager的newcookie事件里记录下了cookie的全部内容,存在cookieStr里。 登录顺序大概如下:
{
IdHTTP1.Get("http://example.com/login.php?name=myname&pwd=abcd");
//--触发cookiemanager.onnewcookie, 取得cookie的内容
idhttp1.request.customer.headers.text="cookie:"+cookieStr;
}以上完成后,就用idhttp1.get("其它网页"), 但是这种get()只发送了10个左右,不管间隔是多久(5秒或30秒),就失去了在线状态。//---
我怀疑的问题是,
每发一个新的IdHTTP1.get("example")时,是否cookie的内容又被更新,下一次发get()时,request.headers.text是否需要再次更新?因为我只在登录的时候,给headers.text赋过一次值。
请高手指点。

解决方案 »

  1.   

    自己顶一下吧,每次idhttp.get()之后,我重新为COOKIE赋了最新的值,但问题依旧,仍旧是连十几次后就断开了。
      

  2.   

    我用Indy8,都没有cookie事件,所以我需要在workend事件里从request里取出cookie,再填到response里,也许你可以试试这个办法。procedure TfrmWelcome.IdHTTP1WorkEnd(Sender: TObject;
      AWorkMode: TWorkMode);
    var
      i: Integer;
      tmp, cookie: String;
    begin
    exit;
    //获得服务器端响应Respoonse中的cookie,并添加到IdHTTP1的request中
      cookie := '';
      for i := 0 to IdHTTP1.Response.ExtraHeaders.Count - 1 do
      begin
        tmp := IdHTTP1.Response.ExtraHeaders[i];
        if pos('set-cookie: ', LowerCase(tmp)) = 0 then Continue;
        tmp := Trim(Copy(tmp, Pos('Set-cookie: ', tmp) + Length('Set-cookie: '), Length(tmp)));
        tmp := Trim(Copy(tmp, 0, Pos(';', tmp) - 1));
        if cookie = '' then cookie := tmp else cookie := cookie + '; ' + tmp;
      end;
      if cookie <> '' then
      begin
        for i := 0 to IdHTTP1.Request.ExtraHeaders.Count - 1 do
        begin
          tmp := IdHTTP1.Request.ExtraHeaders[i];
          if Pos('cookie', LowerCase(tmp)) = 0 then Continue;
          IdHTTP1.Request.ExtraHeaders.Delete(i);
          Break;
        end;
        IdHTTP1.Request.ExtraHeaders.Add('cookie: ' + cookie);
      end;end;
      

  3.   

    可能出现一次get后,触发几次cookie事件,如果仅每次赋最新cookie,造成丢失,在get动作后把cookie添加到request信息中,直到下次get动作前清空。
      

  4.   


    每次get()的确是触发很多次NewCookie事件,因为Cookie包含了好几个项。但我的每个Get()之间有一定的时间差(比如10秒),可以保证最后获得的Cookie是上一次get()触发的最后一次NewCookie事件更新的Cookie值。然后我在下一次Get()前,再把更新过的Cookie值赋给request.customheaders.不是说目前这种程序完全不成功,我不太明白的是,为什么一开始可以,但get()几次之后就不行了。我认真分析过断线前后的request.header值,但没有发现明显的异常。不知道是不是因为网站本身的原因?我想不应该。
      

  5.   

    我把整个代码都粘过来如下:1、主要组件的定义:
    //---------------------------------------  
    object IdHTTP1: TIdHTTP
        AllowCookies = True
        ProxyParams.BasicAuthentication = False
        ProxyParams.ProxyPort = 0
        Request.ContentLength = -1
        Request.ContentType = 'application/x-www-form-urlencoded'
        Request.Accept = 'text/html, */*'
        Request.BasicAuthentication = False
        Request.UserAgent = 'Mozilla/3.0 (compatible; Indy Library)'
        HTTPOptions = [hoForceEncodeParams]
        CookieManager = IdCookieManager1
        Left = 584
        Top = 16
      end
      object IdCookieManager1: TIdCookieManager
        OnNewCookie = IdCookieManager1NewCookie
        Left = 584
        Top = 56
      end
    //-------------------------------------------------------2、主要代码:
    //------------------登录到网站-------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender)
    {Memo1->Text=IdHTTP1->Get("http://www.example.com/dologin.php?pre_url=http%3A//www.example.com&name=tom&password=123456&login.value=10");Timer1->Enabled=true;
    }//------------------------计时器事件--------------------------------------------------
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    { if(IdHTTP1->Request->CustomHeaders->Text.Pos("Cookie:")>0)
        
        IdHTTP1->Request->CustomHeaders->Values["Cookie"]=CookieStr;
     else
        IdHTTP1->Request->CustomHeaders->Text+="Cookie:"+CookieStr;randomize();
    int rndid=random(60);
    String tmpid=Userid[rndid]; //Userid[]为全局字符串数组
    Memo1->Text=Utf8ToAnsi(IdHTTP1->Get("http://www.example.com/user.php?userid="+tmpid));  //我通过返回的字符串来检索是否在线//--------------------NewCookie事件---------------------------------------------------
    void __fastcall TForm1::IdCookieManager1NewCookie(TObject *ASender,
          TIdCookieRFC2109 *ACookie, bool &VAccept)
    {  int i;
      CookieStr="";   //CookieStr为全局字符串变量
      for(i=0;i<IdCookieManager1->CookieCollection->Count;i++)
             { CookieStr=CookieStr+IdCookieManager1->CookieCollection->Items[i]->CookieText; }
         
     }
    //-----------------------------------------------------------------------------------
      

  6.   

    刚粘错了,计时器事件更改如下://------------------------计时器事件--------------------------------------------------
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    IdHTTP1->Request->CustomHeaders->Clear();
    IdHTTP1->Request->CustomHeaders->Text="Cookie:"+CookieStr;randomize();
    int rndid=random(60);
    String tmpid=Userid[rndid]; //Userid[]为全局字符串数组
    Memo1->Text=Utf8ToAnsi(IdHTTP1->Get("http://www.example.com/user.php?userid="+tmpid)); //我通过返回的字符串来检索是否在线