Как установить Cookies на Http Get метод с использованием Java - PullRequest
16 голосов
/ 14 июля 2010

Я хочу сделать GET вручную с файлами cookie, чтобы загрузить и проанализировать веб-страницу.Мне нужно извлечь токен безопасности, чтобы сделать пост на форуме.Я выполнил вход в систему, прочитал ответ и извлек куки (3 пары (имя, значение)).Затем я написал строку, содержащую файлы cookie, например:

CookieString="name1=value1; name2=value2; name3=value3"

Затем я делаю следующее

HttpURLConnection connection
connection = (HttpURLConnection)(new URL(Link).openConnection());
connection.setRequestMethod("GET");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("Cookie", CookieString );
connection.connect();

Затем я читаю страницу, но она показывает, что я не вошел на форум,Что я делаю не так?

edit: я знаю, что должен извлечь маркер безопасности, если я хочу сделать сообщение.Мой ход мыслей состоял в том, что для его извлечения мне нужно ПОЛУЧИТЬ эту конкретную страницу.Но чтобы маркер безопасности был скрытым полем, я должен быть в сети, поэтому мне нужны были куки.Но когда я ПОЛУЧАЮ страницу и устанавливаю файлы cookie, как упомянуто выше, я получаю страницу в качестве гостя, это показывает, что я не в сети, и значение маркера безопасности - это гость, который мне не нужен.Я проверю ссылку, которую вы мне дали, и, надеюсь, найдет решение.

Ответы [ 3 ]

14 голосов
/ 14 июля 2010

Конечно, вы должны собирать файлы cookie из заголовков Set-Cookie ответа. Чтобы отправить их обратно в последующих запросах, вы должны установить их один за другим, используя URLConnection#addRequestProperty().

В основном:

// ...

// Grab Set-Cookie headers:
List<String> cookies = connection.getHeaderFields().get("Set-Cookie");

// ...

// Send them back in subsequent requests:
for (String cookie : cookies) {
    connection.addRequestProperty("Cookie", cookie.split(";", 2)[0]);
}

// ...

split(";", 2) предназначен для того, чтобы избавиться от атрибутов cookie, которые не имеют отношения к серверной стороне, таких как expires, path и т. Д.

Для более удобного HTTP-клиента я бы посоветовал взглянуть на Apache HttpComponents Client . Он может обрабатывать все файлы cookie более прозрачно.

Смотри также:


Обновление : согласно комментариям, это не проблема с cookie. Неправильный токен запроса означает, что на сервере есть встроенная функция предотвращения CSRF / ботов (для предотвращения таких людей, как вы). Вам необходимо извлечь токен как скрытое поле ввода с запрошенной страницы с формой и отправить его в качестве параметра запроса. Jsoup может быть полезен для извлечения всех (скрытых) полей ввода. Не забудьте также передать пару «имя-значение» кнопки, которую вы «программно» нажимаете. Также см. Вышеупомянутую ссылку для большего количества подсказок.

В будущем вам действительно следует более четко понимать, какую именно ошибку вы получите, и не догадываться о чем-то в дикой природе. Вставьте точное сообщение об ошибке и т. Д.

6 голосов
/ 14 июля 2010

Если предположить, что значения cookie не жестко заданы, а получены из предыдущего запроса, вероятно, проще всего использовать класс <a href="http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/api/java/net/CookieHandler.html#setDefault%28java.net.CookieHandler%29" rel="noreferrer">CookieHandler</a>.

CookieHandler.setDefault(new CookieManager());

Тогда ваш HttpURLConnection автоматически сохранит все полученные куки и отправит их со следующим запросом на тот же хост.

0 голосов
/ 14 марта 2013
// Grab Set-Cookie headers:
List<String> cookies = connection.getHeaderFields().get("Set-Cookie");

// ...

// Send them back in subsequent requests:
for (String cookie : cookies) {
    connection.addRequestProperty("Cookie", cookie.split(";", 1)[0]);
}

Приведенный выше код будет работать для отправки нескольких файлов cookie, просто используйте setRequestProperty вместо addRequestPropertyРабочий код:

// Grab Set-Cookie headers:
List<String> cookies = connection.getHeaderFields().get("Set-Cookie");

// ...

// Send them back in subsequent requests:
for (String cookie : cookies) {
    connection.setRequestProperty("Cookie", cookie.split(";", 1)[0]);
}
...