Проблема аутентификации прокси с HttpClient

#java #proxy #httpclient

#java #прокси #httpclient

Вопрос:

У меня есть клиентское приложение, которое подключается к серверу в Интернете для передачи и загрузки файлов.

Однако доступ к Интернету осуществляется через прокси. Я использую HttpClient на толстом клиенте и загружаю файл Apache Commons на стороне сервера.

Я устанавливаю прокси на HttpClient, как показано ниже:

 HttpClient client = new  HttpClient(); 
HostConfiguration config = client.getHostConfiguration(); 
config.setProxy(PROXY_HOST, PROXY_PORT); 

PostMethod filePost = new PostMethod(servletPath); 
int status = client.executeMethod(config , filePost); 
  

Однако вместо жестко заданных значений для PROXY_HOST, PROXY_PORT выше, я использую HttpURLConnection для получения информации о прокси и установки в эти значения. Это работает нормально.

Если я не устанавливаю настройки прокси подобным образом, HttpClient игнорирует настройки моего прокси и не обнаруживает их автоматически, и в результате мое приложение не может подключиться к серверу в Интернете.

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

Может кто-нибудь подсказать, как заставить HttpClient работать с прокси без жесткого кодирования значений PROXY_HOST, PROXY_PORT.

Кроме того, это приложение будет запущено из толстого клиента для разных пользователей. Таким образом, информация о прокси должна автоматически определяться из настроек браузера (что для меня и делает HttpURLConnection).

Может кто-нибудь, пожалуйста, предложить решение для этого сценария?

Комментарии:

1. Какую версию вы используете? Это HostConfiguration выглядит как 3.1 (т. Е. commons HttpClient), и я ничего не нашел здесь об аутентификации. Для компонентов HTTP (например, версии 4.*) на странице примера есть пример.

Ответ №1:

Для прокси и порта я бы предложил использовать системное свойство в командной строке Java следующим образом:

 java -Dhttp.proxyHost=myproxyserver.com -Dhttp.proxyPort=80 MyMainClass
  

Пользователь и пароль будут запрошены у пользователя через графический интерфейс, а затем установлены с помощью метода System.GetProperties().put(строка, String). Параметры являются:

  • http.proxyUser
  • http.proxyPassword

Полная документация доступна здесь. Статью, относящуюся именно к вашей проблеме, можно найти здесь.