Проблемы с использованием Jsoup для получения cookie-файлов sessionId - PullRequest
0 голосов
/ 15 декабря 2011

Я пишу Java-программу, которая частично анализирует 200 уникальных страниц, которые требуют предварительного входа пользователя. Я использовал консоль разработчика Chrome, чтобы определить свой конкретный URL-адрес для входа (https://r.espn.go.com/members/v3_1/login),, чтобы убедиться, что процесс входа в систему использовал запрос POST и имена данных формы для моего имени пользователя (username) и пароля (password). При использовании метод, указанный автором этой записи для извлечения файла cookie SESSIONID для последующих запросов, возвращаемые заголовки сильно отличались, и файлы cookie не возвращались.

Я также попробовал следующий фрагмент кода, в котором используются Jsoup и Apache HttpClient, HttpPost и HttpResponse, который возвращает страницу входа:

MultipartEntity entity = new MultipartEntity();
entity.addPart("username", new StringBody(myUsername));
entity.addPart("password", new StringBody(myPassword));

HttpPost post = new HttpPost(url);
post.setEntity(entity);

HttpClient client = new DefaultHttpClient();
HttpResponse response = client.execute(post);

String html = EntityUtils.toString(response.getEntity());

Document document = Jsoup.parse(html, url);

Каждый пример, который я прочитал, имеет URL-адрес входа с суффиксом .php. Этот метод работает только со службой входа на основе PHP? Или я что-то делаю в корне неправильно?

Спасибо!

1 Ответ

1 голос
/ 15 декабря 2011

Позвольте HttpClient управлять куки / сессией для вас. Чтобы это произошло

  1. Создайте HttpContext и используйте его для каждого запроса, чтобы активировать управление сеансом / cookie.
  2. Настройка магазина печенья
  3. Выполните каждый веб-запрос в контексте, который вы создали на шаге 1

Ниже приведен пример кода для версии HttpClient 4.1.x. Прочитайте Раздел 3.8. Управление состоянием HTTP и контекст выполнения их документации. Также просмотрите эту тему .

//create the local context to be shared across multiple requests of the same session
HttpContext localContext = new BasicHttpContext(); 

 // Create a local instance of cookie store
CookieStore cookieStore = new BasicCookieStore();

// Bind custom cookie store to the local context
localContext.setAttribute(HttpClientContext.COOKIE_STORE, cookieStore);

// execute the post within the context
HttpResponse response = client.execute(post,localContext);

Если это не решило проблему, используйте wireshark или Fiddler2 для проверки трафика HTTP-запросов и ответов.

...