搞了好些日子了,今天终于找到一直无法成功登陆的原因:
因为httpclient是把每一个cookie单独作为一个header来发送给服务器,而IE浏览器是把所有cookie合并成一个header来发送的。写上下面一句就成功登陆了!
client.getParams().setParameter("http.protocol.single-cookie-header", true);
但紧接着问题来了,当我加上这一句之后,虽然能够登陆成功。但是,却出现了一个warning:
2011-4-7 20:41:00 org.apache.commons.httpclient.HttpMethodBase processCookieHeaders
警告: Cookie rejected: "Pauth=240825038%7Chappytest0%7Cbf9558d0c7b868f7384aa563429b6a8e%7C1302180081%7C10001%7Cc3ac05b6cab8a522f483f7589516c1a9%7C". Illegal domain attribute ".my4399.com". Domain of origin: "my.4399.com"
在网上学习了很久,看到有两个解决办法:
1、加上
DefaultHttpParams.getDefaultParams().setParameter("http.protocol.cookie-policy", CookiePolicy.BROWSER_COMPATIBILITY);
2、加上
postmethod.getParams().setParameter("http.protocol.cookie-policy",CookiePolicy.BROWSER_COMPATIBILITY);
但是尝试过,还是解决不了问题。我用的httpclient是3.1版的。
PS:还有一个问题,虽然能登陆成功了。但是好像不能保持登陆成功的状态。请问怎样才能让它保持已登陆的状态呢?
请各位大虾指教~!不胜感激~!!
14 个解决方案
#1
每次都要带上cokie去访问.将cokie的值放在页面上(B/S的话)保存下来,下次访问的时候带上这些cokie值,像一带验证码的系统,第一次访问,得到cokie值,主要是sessionid,将其中生成的验证码生成图片,显示在页面上,自己的系统输入验证码后,再去访问,此时就要带上前面的cokie值了.
#2
楼上的大虾,我不是很明白?你说的这个内容跟我的问题有什么联系吗?
求指教~
#3
我说的是那个保持登录状态的,那个输入验证码的,如何保证前面访问的和后边访问的是一个会话,第一次访问是得到cokie值,得到验证码的图片.这个值码肯定是存在在后台的session中,这时候自己的系统上显示这个验证码图片,点击确定后,将第一次访问到的cokie值和输入的验证码发送到那边系统中.完成验证过程.
#4
哦~~~,我大概能明白您的意思了。
但是,HttpClient不是可以自动模拟浏览器的方式来处理Cookies的吗?那在我后面访问网站的时候不是就自动带上上一次的Cookies信息么?里面不就包括sessionID么?
可能是我嘴拙,没把问题说清,请移步这里:http://topic.csdn.net/u/20110411/00/4a5ab0d3-51a2-4971-8954-f6ddf922ac45.html 这个问题可能问得较为具体些。谢谢大虾的帮忙~!
#5
HttpClient 是可以自动处理模拟浏览器的方式来处理页面请求,但是COOKIE的创建,处理,销毁是要自己手工去操作的,你说的登陆不带COOKIE,是因为你跳转页面时没有把登陆创建的COOKIE带过去新页面
#6
#7
client.getParams().setParameter("http.protocol.single-cookie-header", true);
这一句有错误,类型 DefaultHttpParams 中的方法 setParameter(String, Object)对于自变
量(String, boolean)不适用
这一句有错误,类型 DefaultHttpParams 中的方法 setParameter(String, Object)对于自变
量(String, boolean)不适用
#8
我也遇到类似问题,我是用httpclient 3.1 模拟 新浪微博登录 出现的, 加入client.getParams().setParameter("http.protocol.single-cookie-header", true);
或者
postmethod.getParams().setParameter("http.protocol.cookie-policy",CookiePolicy.BROWSER_COMPATIBILITY);
都不管用.
我看了一下包里面的函数,原因出在 parser.validate(,,,)这个函数中,它里面有一句 if(!host.equals(s)){抛出异常} 它是在一个循环里面的,s 是依次迭代每个cookie的domain ,也就是说它要求每个cookie 的domain 都要和host一直,而我抓包看了一下 一共大概6 ,7 条cookie 的设置,前两个是 .sina.com.cn 后面是 weibo.com
同时我的host 是 由Get中的网址得来的 是weibo.com。 显然前两个cookie不满足它的要求,就抛出警告;另外不知道是不是由于这个警告的原因,我的Get里面ResponseBody的 值也是null(我检查了抓的包明明有内容)。
我看到过一个方法,说是要重新定义自己的CookiePolicy ,然后去register一个, 实现CookieSpec 接口,把里面的Validate 重写,放宽松一点,但是那说的是httpclient 4.X ,3.1的版本好像类结构完全不同,大家能给点建议么?
或者
postmethod.getParams().setParameter("http.protocol.cookie-policy",CookiePolicy.BROWSER_COMPATIBILITY);
都不管用.
我看了一下包里面的函数,原因出在 parser.validate(,,,)这个函数中,它里面有一句 if(!host.equals(s)){抛出异常} 它是在一个循环里面的,s 是依次迭代每个cookie的domain ,也就是说它要求每个cookie 的domain 都要和host一直,而我抓包看了一下 一共大概6 ,7 条cookie 的设置,前两个是 .sina.com.cn 后面是 weibo.com
同时我的host 是 由Get中的网址得来的 是weibo.com。 显然前两个cookie不满足它的要求,就抛出警告;另外不知道是不是由于这个警告的原因,我的Get里面ResponseBody的 值也是null(我检查了抓的包明明有内容)。
我看到过一个方法,说是要重新定义自己的CookiePolicy ,然后去register一个, 实现CookieSpec 接口,把里面的Validate 重写,放宽松一点,但是那说的是httpclient 4.X ,3.1的版本好像类结构完全不同,大家能给点建议么?
#9
没人再来看这个问题了吗?????????????
#10
你把那两个发现的解决方法一起加上试试,这样应该就可以了吧
#11
楼主我也遇到和你一样的问题,你的问题解决没有,能不能给点意见!
#12
能不能讲详细一点怎么样带着cookie去访问啊,谢谢!
#13
你的这个问题解决没有,我也遇到这样的问题,能不能交流一下给点意见啊,谢谢啦!
#14
大牛多的不行。。
#1
每次都要带上cokie去访问.将cokie的值放在页面上(B/S的话)保存下来,下次访问的时候带上这些cokie值,像一带验证码的系统,第一次访问,得到cokie值,主要是sessionid,将其中生成的验证码生成图片,显示在页面上,自己的系统输入验证码后,再去访问,此时就要带上前面的cokie值了.
#2
楼上的大虾,我不是很明白?你说的这个内容跟我的问题有什么联系吗?
求指教~
#3
我说的是那个保持登录状态的,那个输入验证码的,如何保证前面访问的和后边访问的是一个会话,第一次访问是得到cokie值,得到验证码的图片.这个值码肯定是存在在后台的session中,这时候自己的系统上显示这个验证码图片,点击确定后,将第一次访问到的cokie值和输入的验证码发送到那边系统中.完成验证过程.
#4
哦~~~,我大概能明白您的意思了。
但是,HttpClient不是可以自动模拟浏览器的方式来处理Cookies的吗?那在我后面访问网站的时候不是就自动带上上一次的Cookies信息么?里面不就包括sessionID么?
可能是我嘴拙,没把问题说清,请移步这里:http://topic.csdn.net/u/20110411/00/4a5ab0d3-51a2-4971-8954-f6ddf922ac45.html 这个问题可能问得较为具体些。谢谢大虾的帮忙~!
#5
HttpClient 是可以自动处理模拟浏览器的方式来处理页面请求,但是COOKIE的创建,处理,销毁是要自己手工去操作的,你说的登陆不带COOKIE,是因为你跳转页面时没有把登陆创建的COOKIE带过去新页面
#6
#7
client.getParams().setParameter("http.protocol.single-cookie-header", true);
这一句有错误,类型 DefaultHttpParams 中的方法 setParameter(String, Object)对于自变
量(String, boolean)不适用
这一句有错误,类型 DefaultHttpParams 中的方法 setParameter(String, Object)对于自变
量(String, boolean)不适用
#8
我也遇到类似问题,我是用httpclient 3.1 模拟 新浪微博登录 出现的, 加入client.getParams().setParameter("http.protocol.single-cookie-header", true);
或者
postmethod.getParams().setParameter("http.protocol.cookie-policy",CookiePolicy.BROWSER_COMPATIBILITY);
都不管用.
我看了一下包里面的函数,原因出在 parser.validate(,,,)这个函数中,它里面有一句 if(!host.equals(s)){抛出异常} 它是在一个循环里面的,s 是依次迭代每个cookie的domain ,也就是说它要求每个cookie 的domain 都要和host一直,而我抓包看了一下 一共大概6 ,7 条cookie 的设置,前两个是 .sina.com.cn 后面是 weibo.com
同时我的host 是 由Get中的网址得来的 是weibo.com。 显然前两个cookie不满足它的要求,就抛出警告;另外不知道是不是由于这个警告的原因,我的Get里面ResponseBody的 值也是null(我检查了抓的包明明有内容)。
我看到过一个方法,说是要重新定义自己的CookiePolicy ,然后去register一个, 实现CookieSpec 接口,把里面的Validate 重写,放宽松一点,但是那说的是httpclient 4.X ,3.1的版本好像类结构完全不同,大家能给点建议么?
或者
postmethod.getParams().setParameter("http.protocol.cookie-policy",CookiePolicy.BROWSER_COMPATIBILITY);
都不管用.
我看了一下包里面的函数,原因出在 parser.validate(,,,)这个函数中,它里面有一句 if(!host.equals(s)){抛出异常} 它是在一个循环里面的,s 是依次迭代每个cookie的domain ,也就是说它要求每个cookie 的domain 都要和host一直,而我抓包看了一下 一共大概6 ,7 条cookie 的设置,前两个是 .sina.com.cn 后面是 weibo.com
同时我的host 是 由Get中的网址得来的 是weibo.com。 显然前两个cookie不满足它的要求,就抛出警告;另外不知道是不是由于这个警告的原因,我的Get里面ResponseBody的 值也是null(我检查了抓的包明明有内容)。
我看到过一个方法,说是要重新定义自己的CookiePolicy ,然后去register一个, 实现CookieSpec 接口,把里面的Validate 重写,放宽松一点,但是那说的是httpclient 4.X ,3.1的版本好像类结构完全不同,大家能给点建议么?
#9
没人再来看这个问题了吗?????????????
#10
你把那两个发现的解决方法一起加上试试,这样应该就可以了吧
#11
楼主我也遇到和你一样的问题,你的问题解决没有,能不能给点意见!
#12
能不能讲详细一点怎么样带着cookie去访问啊,谢谢!
#13
你的这个问题解决没有,我也遇到这样的问题,能不能交流一下给点意见啊,谢谢啦!
#14
大牛多的不行。。