关于HttpClient的问题,请各位大虾帮帮忙!

时间:2022-09-05 21:14:20

    搞了好些日子了,今天终于找到一直无法成功登陆的原因:
    因为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


引用 1 楼 awusoft 的回复:
每次都要带上cokie去访问.将cokie的值放在页面上(B/S的话)保存下来,下次访问的时候带上这些cokie值,像一带验证码的系统,第一次访问,得到cokie值,主要是sessionid,将其中生成的验证码生成图片,显示在页面上,自己的系统输入验证码后,再去访问,此时就要带上前面的cokie值了.


楼上的大虾,我不是很明白?你说的这个内容跟我的问题有什么联系吗?

求指教~

#3


我说的是那个保持登录状态的,那个输入验证码的,如何保证前面访问的和后边访问的是一个会话,第一次访问是得到cokie值,得到验证码的图片.这个值码肯定是存在在后台的session中,这时候自己的系统上显示这个验证码图片,点击确定后,将第一次访问到的cokie值和输入的验证码发送到那边系统中.完成验证过程.

#4


引用 3 楼 awusoft 的回复:
我说的是那个保持登录状态的,那个输入验证码的,如何保证前面访问的和后边访问的是一个会话,第一次访问是得到cokie值,得到验证码的图片.这个值码肯定是存在在后台的session中,这时候自己的系统上显示这个验证码图片,点击确定后,将第一次访问到的cokie值和输入的验证码发送到那边系统中.完成验证过程.


    哦~~~,我大概能明白您的意思了。
    但是,HttpClient不是可以自动模拟浏览器的方式来处理Cookies的吗?那在我后面访问网站的时候不是就自动带上上一次的Cookies信息么?里面不就包括sessionID么?
    可能是我嘴拙,没把问题说清,请移步这里:http://topic.csdn.net/u/20110411/00/4a5ab0d3-51a2-4971-8954-f6ddf922ac45.html  这个问题可能问得较为具体些。谢谢大虾的帮忙~!

#5


HttpClient 是可以自动处理模拟浏览器的方式来处理页面请求,但是COOKIE的创建,处理,销毁是要自己手工去操作的,你说的登陆不带COOKIE,是因为你跳转页面时没有把登陆创建的COOKIE带过去新页面

#6


该回复于2011-04-11 13:02:50被版主删除

#7


client.getParams().setParameter("http.protocol.single-cookie-header", true);

这一句有错误,类型 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的版本好像类结构完全不同,大家能给点建议么?

#9


没人再来看这个问题了吗?????????????

#10


你把那两个发现的解决方法一起加上试试,这样应该就可以了吧

#11


引用楼主  的回复:
    搞了好些日子了,今天终于找到一直无法成功登陆的原因:
    因为httpclient是把每一个cookie单独作为一个header来发送给服务器,而IE浏览器是把所有cookie合并成一个header来发送的。写上下面一句就成功登陆了!
Java code
 client.getParams().setParameter("http.protocol.single-cookie-h……
楼主我也遇到和你一样的问题,你的问题解决没有,能不能给点意见!

#12


引用 1 楼  的回复:
每次都要带上cokie去访问.将cokie的值放在页面上(B/S的话)保存下来,下次访问的时候带上这些cokie值,像一带验证码的系统,第一次访问,得到cokie值,主要是sessionid,将其中生成的验证码生成图片,显示在页面上,自己的系统输入验证码后,再去访问,此时就要带上前面的cokie值了.
能不能讲详细一点怎么样带着cookie去访问啊,谢谢!

#13


引用 8 楼  的回复:
我也遇到类似问题,我是用httpclient 3.1 模拟 新浪微博登录 出现的, 加入client.getParams().setParameter("http.protocol.single-cookie-header", true);
或者
postmethod.getParams().setParameter("http.protocol.cookie-policy",CookieP……
你的这个问题解决没有,我也遇到这样的问题,能不能交流一下给点意见啊,谢谢啦!

#14


大牛多的不行。。

#1


每次都要带上cokie去访问.将cokie的值放在页面上(B/S的话)保存下来,下次访问的时候带上这些cokie值,像一带验证码的系统,第一次访问,得到cokie值,主要是sessionid,将其中生成的验证码生成图片,显示在页面上,自己的系统输入验证码后,再去访问,此时就要带上前面的cokie值了.

#2


引用 1 楼 awusoft 的回复:
每次都要带上cokie去访问.将cokie的值放在页面上(B/S的话)保存下来,下次访问的时候带上这些cokie值,像一带验证码的系统,第一次访问,得到cokie值,主要是sessionid,将其中生成的验证码生成图片,显示在页面上,自己的系统输入验证码后,再去访问,此时就要带上前面的cokie值了.


楼上的大虾,我不是很明白?你说的这个内容跟我的问题有什么联系吗?

求指教~

#3


我说的是那个保持登录状态的,那个输入验证码的,如何保证前面访问的和后边访问的是一个会话,第一次访问是得到cokie值,得到验证码的图片.这个值码肯定是存在在后台的session中,这时候自己的系统上显示这个验证码图片,点击确定后,将第一次访问到的cokie值和输入的验证码发送到那边系统中.完成验证过程.

#4


引用 3 楼 awusoft 的回复:
我说的是那个保持登录状态的,那个输入验证码的,如何保证前面访问的和后边访问的是一个会话,第一次访问是得到cokie值,得到验证码的图片.这个值码肯定是存在在后台的session中,这时候自己的系统上显示这个验证码图片,点击确定后,将第一次访问到的cokie值和输入的验证码发送到那边系统中.完成验证过程.


    哦~~~,我大概能明白您的意思了。
    但是,HttpClient不是可以自动模拟浏览器的方式来处理Cookies的吗?那在我后面访问网站的时候不是就自动带上上一次的Cookies信息么?里面不就包括sessionID么?
    可能是我嘴拙,没把问题说清,请移步这里:http://topic.csdn.net/u/20110411/00/4a5ab0d3-51a2-4971-8954-f6ddf922ac45.html  这个问题可能问得较为具体些。谢谢大虾的帮忙~!

#5


HttpClient 是可以自动处理模拟浏览器的方式来处理页面请求,但是COOKIE的创建,处理,销毁是要自己手工去操作的,你说的登陆不带COOKIE,是因为你跳转页面时没有把登陆创建的COOKIE带过去新页面

#6


该回复于2011-04-11 13:02:50被版主删除

#7


client.getParams().setParameter("http.protocol.single-cookie-header", true);

这一句有错误,类型 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的版本好像类结构完全不同,大家能给点建议么?

#9


没人再来看这个问题了吗?????????????

#10


你把那两个发现的解决方法一起加上试试,这样应该就可以了吧

#11


引用楼主  的回复:
    搞了好些日子了,今天终于找到一直无法成功登陆的原因:
    因为httpclient是把每一个cookie单独作为一个header来发送给服务器,而IE浏览器是把所有cookie合并成一个header来发送的。写上下面一句就成功登陆了!
Java code
 client.getParams().setParameter("http.protocol.single-cookie-h……
楼主我也遇到和你一样的问题,你的问题解决没有,能不能给点意见!

#12


引用 1 楼  的回复:
每次都要带上cokie去访问.将cokie的值放在页面上(B/S的话)保存下来,下次访问的时候带上这些cokie值,像一带验证码的系统,第一次访问,得到cokie值,主要是sessionid,将其中生成的验证码生成图片,显示在页面上,自己的系统输入验证码后,再去访问,此时就要带上前面的cokie值了.
能不能讲详细一点怎么样带着cookie去访问啊,谢谢!

#13


引用 8 楼  的回复:
我也遇到类似问题,我是用httpclient 3.1 模拟 新浪微博登录 出现的, 加入client.getParams().setParameter("http.protocol.single-cookie-header", true);
或者
postmethod.getParams().setParameter("http.protocol.cookie-policy",CookieP……
你的这个问题解决没有,我也遇到这样的问题,能不能交流一下给点意见啊,谢谢啦!

#14


大牛多的不行。。