IdHTTP 登录并保持在线的问题

野倾 2010-05-01 11:59:02
想实现的功能是,先登录上该网站,然后以登录的用户身份去浏览该网站的其它内容。

此前问过该问题,再叙述一遍,

装了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赋过一次值。


请高手指点。
...全文
568 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangshunzhong 2010-05-04
  • 打赏
  • 举报
回复
我用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;
野倾 2010-05-04
  • 打赏
  • 举报
回复
我把整个代码都粘过来如下:

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; }

}
//-----------------------------------------------------------------------------------
野倾 2010-05-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zhangshunzhong 的回复:]
可能出现一次get后,触发几次cookie事件,如果仅每次赋最新cookie,造成丢失,在get动作后把cookie添加到request信息中,直到下次get动作前清空。
[/Quote]

每次get()的确是触发很多次NewCookie事件,因为Cookie包含了好几个项。但我的每个Get()之间有一定的时间差(比如10秒),可以保证最后获得的Cookie是上一次get()触发的最后一次NewCookie事件更新的Cookie值。然后我在下一次Get()前,再把更新过的Cookie值赋给request.customheaders.

不是说目前这种程序完全不成功,我不太明白的是,为什么一开始可以,但get()几次之后就不行了。我认真分析过断线前后的request.header值,但没有发现明显的异常。

不知道是不是因为网站本身的原因?我想不应该。

野倾 2010-05-04
  • 打赏
  • 举报
回复
刚粘错了,计时器事件更改如下:

//------------------------计时器事件--------------------------------------------------
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)); //我通过返回的字符串来检索是否在线
zhangshunzhong 2010-05-04
  • 打赏
  • 举报
回复
可能出现一次get后,触发几次cookie事件,如果仅每次赋最新cookie,造成丢失,在get动作后把cookie添加到request信息中,直到下次get动作前清空。
野倾 2010-05-03
  • 打赏
  • 举报
回复
自己顶一下吧,每次idhttp.get()之后,我重新为COOKIE赋了最新的值,但问题依旧,仍旧是连十几次后就断开了。

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧