Jsoup重定向与浏览器重定向的行为不同

时间:2017-01-18 10:40:04

标签: redirect jsoup

我通过Jsoup(最新版本1.10.2)面向服务器从页面中提取一些数据。 此服务器向匿名用户开放,但它使用重定向链为每个用户授予会话ID。

这是我通过浏览器得到的序列:

  1. 首次请求http://SERVER_HOST/page
    resp:302重定向到位置http://SSO_SERVER
  2. 关注重定向,打开http://SSO_SERVER
    resp:302重定向到位置http://SERVER_HOST/page?sessionID=123456
  3. 关注重定向,打开http://SERVER_HOST/page?sessionID=123456
    resp:200:)
  4. 出乎意料的是,Jsoup的重定向链失败了。看看第2步的差异:

    1. 首次请求http://SERVER_HOST/page(不含cookie)
      resp:302重定向到位置http://SSO_SERVER
    2. 关注重定向,打开http://SSO_SERVER
      resp:302重定向到位置/共享/ SSO / http%3a%2f%2SERVER_HOST / page%3dsessionID = 123456
    3. 关注重定向,打开http://SSO_SERVER/shared/SSO/http%3a%2f%2SERVER_HOST/page%3dsessionID=123456 resp:未找到400 :(
    4. 在步骤2中,服务器响应中的重定向位置以" /"开头。不是" http://",所以在第3步它连接到错误的主机。

      为什么在第2步,根据请求属于浏览器或JSoup,我在服务器响应中得到了不同的位置?

      我将JSoup请求设置为浏览器请求的相同标头:

      Response response = Jsoup.connect(link) 
                          .userAgent("Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36")
                          .header("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8") 
                          .header("Accept-Encoding", "gzip, deflate, sdch") 
                          .header("Accept-Language", "it,en-US;q=0.8,en;q=0.6")
                          .header("Upgrade-Insecure-Requests", "1")
                          .method(Method.GET)
                          .followRedirects(true).execute();
      

1 个答案:

答案 0 :(得分:2)

Jsoup.Connect()中存在一个错误,指出如何处理重定向标头中的查询字符串。

现在已修复this commit。您可以构建HEAD来访问修复程序,它将在下一个版本(1.10.3)中提供。