Класс клиента 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));

2 ответа

Решение

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

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

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

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

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

РЕДАКТИРОВАТЬ: Обновление ответа в соответствии с комментарием

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

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

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

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

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

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

Другие вопросы по тегам