搞了好些日子了,今天终于找到一直无法成功登陆的原因:
    因为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:还有一个问题,虽然能登陆成功了。但是好像不能保持登陆成功的状态。请问怎样才能让它保持已登陆的状态呢?   请各位大虾指教~!不胜感激~!!

解决方案 »

  1.   

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

  2.   

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

  3.   


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

  4.   

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

  5.   

    client.getParams().setParameter("http.protocol.single-cookie-header", true);这一句有错误,类型 DefaultHttpParams 中的方法 setParameter(String, Object)对于自变
     量(String, boolean)不适用
      

  6.   

    我也遇到类似问题,我是用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的版本好像类结构完全不同,大家能给点建议么?
      

  7.   

    能不能讲详细一点怎么样带着cookie去访问啊,谢谢!