分享

一个无法获取IE的COOKIES的问题

 quasiceo 2014-07-30
使用Twebbrowser访问并登录网站http://bbs.,用如下代码获取不了COOKIES,改成用InternetGetCookie,也不行,请各位朋友帮忙试一下,找出原因。
用抓包工具HTTPANALYZER查看,是有COOKIES的,问题是我无法获取到。

我的代码就如上所示,访问其他网站都可以获取到COOKIES,唯独这个网站不行,不知道原因
Delphi/Pascal code?
1
2
3
4
5
procedure TFrm_webview.webDocumentComplete(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
begin
  Cookieview.Text:=(web.document as ihtmldocument2).cookie;
end;



ondocumentcomplete事件会触发多次,基本上第一次不是我们想要的

所以你会出错。你可以改成这样

procedure TFrm_webview.webDocumentComplete(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
begin
if web.LocationURL=URL then
  Cookieview.Text:=(web.document as ihtmldocument2).cookie;
end;

这样就能保证是在页面完全打开后才取cookie了


首先声明一个全局变量

 Doc : IHTMLDocument2; 
      注意头部要加上mshtml

 
   WebBrowser1.Navigate(Edit1.Text);

 在webbrowser1的DocumentComplete事件中加入以下代码  ---取cookie值 
  Doc:=WebBrowser1.Document as IHTMLDocument2;  //获得 一个IHTMLDocument2对象
  edit2.Text:=Doc.cookie;    //Doc.cookie就是页面COOKIE信息了 

 在webbrowser1的ProgressChange事件中加入以下代码 
 if WebBrowser1.LocationURL <> 'about:blank' then
    edit1.Text := WebBrowser1.LocationURL //请注意此处为地址栏,当你点击其他页面的时候也要让他跟着变
  else                                      //要不然当你想修改COOKIE的时候会发现无法修改  
    Edit1.Text := '';

 
 修改COOKIE按钮一个
 在按钮中声明一个SList: TStrings;
 然后在begin和end插入
 if Edit2.Text = '' then Exit;
 SList := TStringList.Create; {修改浏览器的Cookies}
 Slist.CommaText := Edit2.Text;
 for i := 0 to SList.Count - 1 do {将Cookies分段提交给浏览器}
  Doc.cookie := SList.Strings[i];
 Webbrowser1.Refresh; {修改后Cookies后刷新浏览器}
 SList.Free; {释放}   

发现问题所在了,应该是该网站对COOKIES设置了HttpOnly属性,导致COOKIES无法被客户端访问,请问如何访问具有HttpOnly属性的COOKIES

一个取得IE cookie的函数,不知道对你有没有用。不需要WEBBROWSER
Delphi/Pascal code?
1
2
3
4
5
6
7
8
function GetCookie():string;
var
  cookbuffer:array[0..1023of char;
  Size : Dword;
begin
  InternetGetCookie(pchar('http://tieba.baidu.com/'),pchar('BAIDUID'),cookbuffer,size);
  result := cookbuffer;
end;

调用
Delphi/Pascal code?
1
2
3
4
5
6
7
var
  str : string;
begin
  str := GetCookie(); //必要的
  idhttp1.Request.CustomHeaders.Text := 'Cookie: '+str; 
  Memo1.Text := idhttp1.Get('http://bbs.');
en


internetGetCookie 只读取 COOKIES目录下生成的COOKIE,HTTPONLY属性则不生成本地COOKIES中的文件,而是直接通过HTTP头来传输,所以要用其他的办法,

VC中用 
DO{
SUCCESS=CHTTPFILE::QueryInfo(HTTP_QUERY_SET_COOKIE,cookie.GetBuffer(),&dwbuflen,&dwval);
}WHILE(SUCCESS)
完全可以读出!!

欢迎交流!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多