使用httpwebrequest模拟登录后的cookie

theks 2012-01-13 12:54:14
有过这方面经验的兄弟们回复一下。。

我用HttpWebRequest模拟某网站的登录,用户名和密码是post方法提交的。
它在登录成功后并没有立即写入cookie,而是在Response的HTML中,通过请求图片URL和js脚本访问别的网址,根据session再写cookie。
由于这网站包括论坛和其它模块(包括子域名和别的域名,五六个吧),所以有多个分别写入cookie的请求对应各个子模块,做的单点登录。比如:
通过请求<img src="http://www.a.com/verify/?一些参数.." />写入cookie "web_member_id";
通过请求<script type="text/javascript" src="http://bbs.a.com/verify/?一些参数.."></script>写入cookie "bbs_member_id";
我只用到网站的,就再次请求写入网站cookie的js,把cookie写入CookieContainer,浏览登录后的页面都没问题。
问题出在下一步,我要发布一些东西到后台(保存到数据库),post提交表单时,报"Restricted access!"访问受限。。用HttpAnalyzer查看构造的post Data跟在浏览器中真实提交的真实数据是一样的,只是cookie不一样。
Reissue Request重新发送请求,模拟提交总是Restricted access,真实提交总是成功。

我猜测原因如下:
1.cookie中缺少东西。所以我打算把所有的cookie都写入,模拟真实的登录。
在获得登录成功后响应的HTML中,因为它有多个写入cookie的请求,我觉得用正则表达式提出来分别去请求一遍太费事了,有没有办法执行这段html取得全部的cookie保存下来?
注意,我这项目是个后台服务,所以没有界面,也就用不到WebBrowser控件。

2.该网站有别的限制模拟提交的方法。
这方面完全无法着手啊。
这网站是用php写的。
...全文
477 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
大飞飞虫 2012-01-13
  • 打赏
  • 举报
回复
HttpWebRequest 的方式的话表示你还得自己去解析获得到的 response HTML, 然后逐个再用 HttpWebRequest 去请求这些URL才能写COOKIE,

因为你不具备执行HTML的能力,必须全套模拟它的做法
theks 2012-01-13
  • 打赏
  • 举报
回复
我用HttpAnalyzer把正常提交的cookie一项项地去掉重发请求,找到了结果,确实是少了个cookie项,多请求一张图片解决了。
结帖了
theks 2012-01-13
  • 打赏
  • 举报
回复
#3楼,
谢谢。
通过HttpAnalyzer截获的结果看,CookieContainer没什么问题,只是我故意少写入了一些觉得可能无关的cookie项,因为这网站写全部的cookie要分别请求七、八次,太费事。
我的项目是一键发布到同行业的多个网站,这只是其中一个网站,不能响应太慢。
我试下不用CookieContainer,遍历cookie写入吧,不过应该不是这原因。
机器人 2012-01-13
  • 打赏
  • 举报
回复
.net 4.0 之前的 CookieContainer 有bug,你可以直接通过 HttpResponse.Headers["Set-Cookie"] 取cookie字符串而不是通过 CookieContainer 来操作。
theks 2012-01-13
  • 打赏
  • 举报
回复
感谢#1楼哥们回复。

对啊,我就是想问,有没办法执行这响应的html,而不是分析出URL一个个去请求。。。
代码下载地址: https://pan.quark.cn/s/ee8627e4e6d7 ABAP调试器是一种功能强大的工具,可用于在执行期间对ABAP代码进行检验。除了常规的核心功能(例如逐行运行代码以及检验变量、字段符号和引用的值)之外,它还提供了一些辅助性的特性,能够简化并压缩调试会话的时长。并非所有使用者都熟悉这些辅助特性。SAP ABAP调试器是处理和优化ABAP代码开发与维护工作的核心资源,它配备了多样的功能来协助开发人员在运行状态下进行检验和排除故障。此资源着重阐述了ABAP调试器的一些高级特性,涵盖了深入分析调用堆栈、系统级调试、更新会话调试以及提升调试效率的方法。 1. **深入分析调用堆栈**:除了常规的应用程序调试,开发人员有时需要对调用堆栈的内部层级进行深入调试,特别是在错误出现在异步执行的更新处理或系统级程序时。通过启用**系统级调试**,可以访问通常不公开的系统代码,但这也会导致调用堆栈的显著增加,因此需要审慎操作。 2. **系统级调试**:对于不含业务逻辑的系统级程序,开发人员通常无需进行调试。然而,在特定情形下,例如进行错误追踪时,可能需要进入系统代码。借助调试器的“系统调试启用/禁用”选项,可以赋予对系统程序的调试权限。 3. **更新会话调试**:在处理异步更新任务,例如持久化业务数据时,错误可能发生在更新任务内部。激活**更新会话调试**,在更新任务完成后,调试器将自动启动,展示执行路径。比如,在变更成本中心后,通过输入调试指令 "/h" 启动调试,保存后能够看到更新过程中的错误。 4. **分析调用堆栈**:在进行深入调试时,调用堆栈是至关重要的。通过分析调用堆栈,能够定位到引发问题的具体位置,如在VB_V2_NORMAL...

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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