cppwebbrowser navigate方法 身份验证的问题

h13bk 2005-11-28 04:14:34
某些网站需要用户身份才能浏览一些页面,当使用cppwebbrowser控件在浏览时,我已经以合法用户登录后,如果新的页面是在cppwebbrowser中直接点击网页上的连接打开则没有问题,但是如果我想用navigate或者navigate2方法直接跳转到需要浏览的页面时,就会出现用户身份不符合的非法连接错误,请问如何解决?
...全文
545 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
dxqxiaoqiang 2006-02-20
  • 打赏
  • 举报
回复
各位老大,我上面提到的地址验证是怎么回事,请高手指导。
dxqxiaoqiang 2006-02-20
  • 打赏
  • 举报
回复
有这样一个网页,http://www.pampers.com.cn/bsod/seebaby.asp?ID=BJ01109,
直接Navigate http://www.pampers.com.cn/bsod/seebaby.asp?ID=BJ01109,就会告诉你地址来源错误,
如果从http://www.pampers.com.cn/bsod/page3d.asp搜索宝宝:BJ01109进入http://www.pampers.com.cn/bsod/seebaby.asp?ID=BJ01109,后refresh()就没有问题。

这里的地址验证服务器可能是如何判断地来源错误的?
minlulu 2006-02-06
  • 打赏
  • 举报
回复
save
Lo 2006-01-19
  • 打赏
  • 举报
回复
同意楼上
蒋晟 2005-12-26
  • 打赏
  • 举报
回复
Session是每个进程一个的,所以你要保持Session的话就要处理newwindow2事件,创建一个包含浏览器控件的窗口,然后返回给newwindow2,这样新的页面会在本进程内打开而不是在IE进程内打开。
gordonwg 2005-12-25
  • 打赏
  • 举报
回复
study
h13bk 2005-12-16
  • 打赏
  • 举报
回复
h13bk 2005-12-12
  • 打赏
  • 举报
回复
老兄,不行啊,这样只能跳转到带有明确用户名密码参数的页面,比方说你例子中的test=333333&PassWord=343200,但是我现在要跳转的只是一个地址,在ie里也只能看到但单纯的.asp结尾的一个字符串,根本不知道它参数的格式(或者会员身份是用cookie之类的检测),然后就算用模拟登陆的办法自动填表进入了,模拟点击连接的时候,有的连接需要弹出新的窗口,这时如果不处理onnewwindow2事件,则弹出ie,显示检测不到会员的权限,如果在onnewwindow2中 *ppDisp=CppWebBrowser1->Application; *Cancel=false; 结果就什么也没有了,我想知道在浏览器中(ie,tt)之类的在弹出新窗口的时候到底怎样处理才能正常显示新的带有会员权限页面?
h13bk 2005-12-10
  • 打赏
  • 举报
回复
多谢,我试试
guanshangming 2005-12-01
  • 打赏
  • 举报
回复
刚刚在CSDN看到的,漏了url地址,供参考。
主  题: CBC程序如何模拟IE登陆web系统,并且访问会员功能?
作  者: _zZ (精灵)
等  级:
信 誉 值: 100
所属社区: C++ Builder 基础类
问题点数: 20
回复次数: 7
发表时间: 2005-11-18 10:41:29



因为测试系统的需要,必须用cbc程序登陆一个有口令的web系统,然后取得页面自动分析海量数据正确与否,但是在登录以后会遇到302错误,其实就是登录验证页面完成后跳转到服务页面,我在取得跳转的页面之后,web系统认为是非法连接,再次跳转,有没有办法实现模拟浏览器点击登录网页呢?
这种功能肯定有,因为在使用专业压力测试软件时候,他们都可以模拟登录以及后续的业务操作,不会被web系统人为是"盗链"也能自动使用302跳转.
这样的程序怎么写呀!高手
(注解:当然不指望适用对有"图形验证码"的系统进行登录:)

回复人: cool222(CSDN 政治辅导员) ( ) 信誉:92 2005-11-18 11:18:00 得分: 0


给你一个直接Post的函数
如:
WebPostData(CppWebBrowser1,"http://211.91.2.221/pass.asp";
,"test=333333&PassWord=343200");

我试过,可以用


void __fastcall TForm1::WebPostData(TCppWebBrowser *CppWebBrowser, String sURL, String sPostData)
{
BSTR bstrHeaders = NULL;
TVariant vFlags = {0}, vTargetFrameName={0}, vPostData={0}, vHeaders={0};
LPSAFEARRAY psa;
LPCTSTR cszPostData = sPostData.c_str();
UINT cElems = lstrlen(cszPostData);
LPSTR pPostData;
LPVARIANT pvPostData;

bstrHeaders = SysAllocString(L"Content-Type: application/x-www-form-urlencodedrn");
if (!bstrHeaders){
Application->MessageBox("Could not allocate bstrHeaders", "Warning", MB_OK | MB_ICONWARNING);
return;
}

V_VT(&vHeaders) = VT_BSTR;
V_BSTR(&vHeaders) = bstrHeaders;

pvPostData = vPostData;

if(pvPostData){
VariantInit(pvPostData);

psa = SafeArrayCreateVector(VT_UI1, 0, cElems);
if(!psa){
return;
}

SafeArrayAccessData(psa, (LPVOID*)&pPostData);
memcpy(pPostData, cszPostData, cElems);
SafeArrayUnaccessData(psa);

V_VT(pvPostData) = VT_ARRAY | VT_UI1;
V_ARRAY(pvPostData) = psa;
}

CppWebBrowser->Navigate((TVariant)sURL, &vFlags, &vTargetFrameName, &vPostData, &vHeaders);
}


更多TCppWebBrowser组件相关文章参阅:http://www.chinaeic.com/bbs/forums.php?forumid=20


Top

回复人: _zZ(精灵) ( ) 信誉:100 2005-11-24 09:46:00 得分: 0


好像还是不行
WebPostData(CppWebBrowser1,"http://aa.aa.com/a.asp?a=1&b=2","");
出来一个列表,找到其中的一个url=newUrlString
WebPostData(CppWebBrowser1,newUrlString,"");
这个时候web会认为不是从http://aa.aa.com/a.asp?a=1&b=2 过来的页面访问,作为盗链,跳转首页,web页面到是显示的很正常,但是我要的那个页面就是不出来!
怎么样在的一页上模拟点击其中一个url呢??!!!
高手!好人做到低!!....



Top

回复人: XBox360(菜)(鸟) ( ) 信誉:100 2005-11-24 10:05:00 得分: 0


我这里有个函数,可以自动填表
偶修改了之后用这个实现了自动登陆等一些功能
你自己修改一下吧

void __fastcall TForm1::PutInput(TCppWebBrowser *CppWebBrowser1, AnsiString ActionStr)
{
//赋值
AnsiString MyStr = ActionStr;
AnsiString SName,SId,SValue;

SName = MyStr.SubString(1,MyStr.Pos(",")-1);
MyStr = MyStr.SubString(MyStr.Pos(",")+1,MyStr.Length()-MyStr.Pos(","));

SId = MyStr.SubString(1,MyStr.Pos(",")-1);
SValue = MyStr.SubString(MyStr.Pos(",")+1,MyStr.Length());
if(SValue==NULL)SValue="";

VARIANT id, index,id1,index1;
IDispatch *spDispatch;
IHTMLDocument2 *pDoc2;
IHTMLElement *pElement;
IHTMLElementCollection *pElementCol;
IHTMLFormElement *pFormElement;
IHTMLInputElement *pInputElement;

IDispatch *WebDocument=static_cast<IDispatch*>(CppWebBrowser1->Document);
pDoc2=static_cast<IHTMLDocument2*>(WebDocument);

//首先获取IWebBrowser2接口
if (SUCCEEDED(pDoc2->get_forms(&pElementCol))) //得到form
{
long p=0;
if(SUCCEEDED(pElementCol->get_length(&p))) //哪一个form
if(p!=0)
{
for(long i=0;i<=(p-1);i++)
{
V_VT(&id) = VT_I4;
V_I4(&id) = i;
V_VT(&index) = VT_I4;
V_I4(&index) = 0;

if(SUCCEEDED(pElementCol->item(id,index, &spDispatch)))
{
if(SUCCEEDED(spDispatch->QueryInterface(IID_IHTMLFormElement,(void**)&pFormElement)))
{
long q=0;
if(SUCCEEDED(pFormElement->get_length(&q))) //得到form中的控件个数
for(long j=0;j<=(q-1);j++)
{
V_VT(&id) = VT_I4;
V_I4(&id) = j;
V_VT(&index) = VT_I4;
V_I4(&index) = 0;
if(SUCCEEDED(pFormElement->item(id,index, &spDispatch)))
{
if(SUCCEEDED(spDispatch->QueryInterface(IID_IHTMLElement,(void**)&pElement)))
{
if(SUCCEEDED(spDispatch->QueryInterface(IID_IHTMLInputElement,(void**)&pInputElement)))
{
//AfxMessageBox("已经获取IHTMLInputTextElement");
BSTR Value;
BSTR Type;
BSTR Id;
BSTR Name;

pInputElement->get_type(&Type); //获取类型
// pInputElement->get_value(&Value); //获取值
pElement->get_id(&Id);//获取Id的方法不一样
// pInputElement->get_name(&Name); //获取它的名字

AnsiString tempName;
tempName = AnsiString(Id).UpperCase();
if(tempName!=NULL && ((tempName.Trim()).Length()>0) && tempName == SId.UpperCase())
{
tempName = AnsiString(Type).UpperCase();
if(tempName == "TEXT") //获取和设置文本框的值
{
// WideString temp = SValue;
pInputElement->put_value((WideString)SValue.c_str());

}
else if(tempName == "PASSWORD") //获取和设置密码框的值
{
pInputElement->put_value((WideString)SValue.c_str());
}
else if(tempName == "RADIO") //获取和设置单选的值
{
pElement->click(); //模拟单击
}
else if(tempName == "CHECKBOX") //获取和设置多选框的值
{
pElement->click(); //模拟单击
// pInputElement->put_checked(j);
}
else if(tempName == "BUTTON") //非提交按钮
{
//pElement->click(); //模拟单击
}
else if(tempName == "SUBMIT") //提交按钮
{
//模拟单击
}
break;
}//如果不符,则不做处理
pInputElement->Release();
}
else //不是input框
{
}
pElement->Release();
}//if pelement
spDispatch->Release();
}
}
pFormElement->Release();
}
spDispatch->Release();
}
}
}
}
if(pDoc2) pDoc2->Release();
}


Top

回复人: _zZ(精灵) ( ) 信誉:100 2005-11-25 10:09:00 得分: 0


很好谢谢!get_form这个我肯定是需要的:)
我还需要一个所有URL的对象,然后模拟点击其中某个URL (xURL->click())然后得到新的body对象; 是不是通过get_links得到所有URL对象呢?具体程序怎么写?我在网络上搜了半天都没有找到,求大家帮忙。



h13bk 2005-12-01
  • 打赏
  • 举报
回复

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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