2017-01-18 9 views
1

Я сталкиваюсь с сервером через Jsoup (последняя версия 1.10.2), чтобы извлечь некоторые данные со страницы. Этот сервер открыт для анонимных пользователей, но он использует цепочку перенаправления для предоставления идентификатора сеанса каждому пользователю.Jsoup redirect имеет такое же поведение, как переадресация браузера

Это последовательность, я получил в браузере:

  1. Первый запрос на http://SERVER_HOST/page
    гезр: 302 Redirect на участке http://SSO_SERVER
  2. Follow перенаправлять, открытие http://SSO_SERVER
    соотв: 302 редирект на участке http://SERVER_HOST/page?sessionID=123456
  3. Последующее перенаправление, открытие http://SERVER_HOST/page?sessionID=123456
    resp: 200 :)

Неожиданно с Jsoup цепочка перенаправления выходит из строя. Обратите внимание на разницу в шаге 2:

  1. Первый запрос на http://SERVER_HOST/page (без печеньем)
    соответственно: 302 Перенаправление на участке http://SSO_SERVER
  2. Follow перенаправлять, открытие http://SSO_SERVER
    соответственно: 302 Перенаправление на участке/разделяемой/SSO/HTTP% 3a% 2f% 2SERVER_HOST/страница% 3dsessionID = 123456
  3. Следовать перенаправлять, открытие http://SSO_SERVER/shared/SSO/http%3a%2f%2SERVER_HOST/page%3dsessionID=123456 соответственно: 400 не найдено :(

На шаге 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(); 

ответ

2

Существовал ошибка в Jsoup.Connect() в том, как была обработана строка запроса в заголовке переадресации.

Это исправлено сейчас в this commit. Вы можете построить HEAD, чтобы получить доступ к исправлению, и он будет доступен в следующей версии (1.10.3).

+0

К сожалению, в моем вопросе была опечатка. Я просто использую ver 1.10.2. Мне интересно, мог ли сервер распознать запрос от JSoup для создания другого ответа, чем запрос браузера. –

+0

OK, спасибо за разъяснение. Все возможно, но с установкой UA это не будет моей догадкой. Похоже, что что-то не декодируется и не кодируется правильно. Я не могу отлаживать его для вас без URL-адреса или другого способа его репликации. Вы можете открыть проблему и связаться со мной в автономном режиме, если хотите. –

+0

Вы можете проверить https://github.com/fabioformosa/jsoup-bug-reproduce.git для воспроизведения. Большое спасибо Джонатан. –