Класс клиента Java Proxy, поддерживающий аутентификацию

Я ищу клиентский класс прокси-сервера java socks, который поддерживает аутентификацию, какие-либо предложения? java.net.Proxy не поддерживает аутентификацию.

Редактировать: я не могу найти способ прикрепить данные аутентификации к конкретному прокси-серверу через сокет. Authenticator.setDefault() допускает только один набор учетных данных.

 Authenticator.setDefault(new Authenticator(){
  protected  PasswordAuthentication  getPasswordAuthentication(){
   PasswordAuthentication p=new PasswordAuthentication("xxx", "xxx".toCharArray());
   return p;
  }
 });
 Proxy proxy = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress("xxx.xx.xxx.xxx", xxx));

   Socket sock = new Socket(proxy);

   sock.connect(new InetSocketAddress(server,xx));

person user121196    schedule 08.10.2009    source источник


Ответы (2)


Java поддерживает настройку прокси-сервера Socks через зарегистрированный java.net.Authenticator или через настройки, как описано в Свойства сети:

Настройки поддержки протокола SOCKS

Имя пользователя и пароль SOCKS получаются следующим образом. Во-первых, если приложение зарегистрировало экземпляр по умолчанию java.net.Authenticator, то он будет запрошен с протоколом, установленным на строку SOCKS5, и приглашением, установленным на аутентификацию строки SOCKS. Если аутентификатор не возвращает имя пользователя/пароль или если аутентификатор не зарегистрирован, система проверяет пользовательские настройки java.net.socks.username и java.net.socks.password. Если эти предпочтения не существуют, то системное свойство user.name проверяется на наличие имени пользователя. В этом случае пароль не предоставляется.

socksProxyHost
socksProxyPort (по умолчанию: 1080)
Указывает имя прокси-сервера SOCKS и номер порта, который будет использоваться уровнем протокола SOCKS. . Если указано socksProxyHost, то все сокеты TCP будут использовать прокси-сервер SOCKS для установления или принятия соединения. Прокси-сервер SOCKS может быть сервером SOCKS v4 или v5, и он должен разрешать соединения без проверки подлинности.

Для примеров клиентского кода вы можете проверить ">этот ответ о переполнении стека.

EDIT: обновление ответа согласно комментарию

Побочным эффектом поддержки SOCKS в JDK является то, что вся ваша JVM будет проходить через один и тот же прокси-сервер SOCKS. Так что это может не сработать для вас.

Authenticator влияет на всю аутентификацию в вашей JVM (HTTP-аутентификация, прокси-аутентификация). Итак, опять же, это может не сработать для вас.

В вашем случае возможным решением будет использование HttpClient из HttpComponents (преемник устаревшего Общий HTTP-клиент 3.x). Ознакомьтесь с примерами и особенно Запрос через прокси-сервер и Прокси-аутентификация примеры.

person Pascal Thivent    schedule 08.10.2009
comment
что, если мне нужно изменить логин и пароль для аутентификации на основе разных прокси-серверов? Authenticator.getPasswordAuthentication() разрешает только один набор учетных данных. - person user121196; 09.10.2009
comment
Я думаю, что Authenticator мне подходит, так как я могу использовать Authenticator.getRequestHost() для назначения разных Authenticator для каждого хоста. Мне нужен сокет, а не клиент на основе http, поэтому HttpClient у меня не работает. - person user121196; 09.10.2009
comment
Обратите внимание, что ссылки в приведенном выше ответе больше не работают. - person crockpotveggies; 20.01.2016

Используйте этот HttpClient (не Apache),

http://www.innovation.ch/java/HTTPClient/

Это просто обработчик URL, поэтому вы можете использовать обычный HTTPUrlConnection. Он поддерживает SOCKS и другие прокси.

person ZZ Coder    schedule 08.10.2009