Как установить Cookies в Http Get метод с помощью Java

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

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();

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

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

Ответы

Ответ 1

Чтобы быть уверенным, вы должны собирать файлы 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 может оказаться полезным для извлечения всех (скрытых) полей ввода. Не забудьте также передать пару с именем и кнопкой, которую вы хотите "нажать" программно. Также см. Вышеупомянутую ссылку для получения дополнительных советов.

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

Ответ 2

Предполагая, что значения cookie не жестко закодированы, но получены из предыдущего запроса, вероятно, проще всего использовать класс CookieHandler.

CookieHandler.setDefault(new CookieManager());

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

Ответ 3

// 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]);
}