Как получить защищенный веб-ресурс от Java-клиента - PullRequest
2 голосов
/ 12 декабря 2011

У меня есть веб-приложение Java, которое использует аутентификацию на основе форм.Если обычный веб-пользователь заходит на мой сайт, он перенаправляется на login.jsp, он отправляет свои учетные данные, а затем ему предоставляется ресурс.

У меня есть простой Java-клиент, который должен публиковать информацию в моем веб-приложении.Когда мой клиент java публикует информацию, сервер отправляет обратно login.jsp, чего я и ожидал.Я могу отправить второй запрос в j_security_check с учетными данными, но любой дополнительный запрос, который я отправляю, все еще проходит, как будто я не аутентифицирован.

Я знаю, что браузеры хранят информацию о сеансе в заголовках и передают эту информацию обратно на сервер, чтобы помочь поддерживать состояние, но как мне сделать что-то похожее с Java-клиентом, чтобы аутентифицировать последующие запросы.

1 Ответ

3 голосов
/ 12 декабря 2011

Это происходит потому, что вы не отправляете куки.

При первом обращении к серверу он создает сессию для вас.Сессия имеет идентификатор.Этот идентификатор отправляется клиенту в виде специального файла cookie, например, сервер отправляет заголовок HTTP Set-Cookie.Обычно серверы на основе Java используют cookie с именем jsessionid, но это на самом деле не имеет значения.Вы на стороне клиента должны получить значение заголовка ответа Set-Cookie и отправить его обратно, используя HTTP-заголовок Cookie.В этом случае сервер будет обрабатывать ваши второй и третий (и т. Д.) Запросы в контексте одного и того же сеанса.Ваш второй запрос (публикация формы входа) делает сеанс аутентифицированным, поэтому вы не будете перенаправлены на форму входа снова и снова.

Если вы можете настроить серверную часть, вы можете сделать это проще.Сервер также должен быть настроен на поддержку базовой аутентификации (дополнительно для аутентификации на основе форм).Таким образом, ваш клиент может отправить заголовок Authorization со значением Basic USER:PASSWORD, где USER & PASSWORD должен быть отправлен в форме Base64.

EDIT: вы можете использовать Jakarta HttpClient.Это упрощает все, когда вы имеете дело с HTTP.Но стандартная Java HttpURLConnection тоже справится с этой задачей.

...