Рубрики
Без рубрики

Подключение через прокси-серверы в ядре Java

Узнайте, как подключаться к прокси-серверам на Java с помощью системных свойств или более гибкого класса прокси.

Автор оригинала: Chris Oberle.

1. введение

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

В этом уроке мы рассмотрим как подключиться через прокси-серверы на Java .

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

2. Настройка

Чтобы запустить примеры из этой статьи, нам понадобится доступ к прокси-серверу. Squid – популярная реализация, доступная для большинства операционных систем. Конфигурация Squid по умолчанию будет достаточно хороша для большинства наших примеров.

3. Использование глобальной настройки

Java предоставляет набор системных свойств, которые можно использовать для настройки поведения в рамках JVM. Этот подход “один размер подходит всем” часто проще всего реализовать, если он подходит для конкретного случая использования.

Мы можем задать необходимые свойства из командной строки при вызове JVM . В качестве альтернативы мы также можем установить их, вызвав System.setProperty() во время выполнения .

3.1. Доступные Системные свойства

Java предоставляет обработчики прокси-серверов для протоколов HTTP, HTTPS, FTP и SOCKS. Прокси-сервер может быть определен для каждого обработчика как имя хоста и номер порта:

  • http.proxyHost – Имя хоста HTTP-прокси-сервера
  • http.proxyPort – Номер порта прокси – сервера HTTP-свойство является необязательным и по умолчанию равно 80, если не указано
  • http.nonProxyHosts – Разделенный каналами (“|”) список шаблонов хостов, для которых прокси-сервер должен быть обойден – применяется как для обработчиков HTTP, так и для HTTPS, если установлено
  • socksProxyHost – Имя хоста прокси-сервера SOCKS
  • socksProxyPort – Номер порта прокси-сервера SOCKS

При указании непрофессиональных хостов шаблоны хостов могут начинаться или заканчиваться символом подстановки (“*”). Возможно, потребуется избежать разделителя “|” на платформах Windows. Исчерпывающий список всех доступных системных свойств, связанных с прокси, можно найти в Официальной документации Oracle Java по свойствам сети .

3.2. Установка с помощью Аргументов командной строки

Мы можем определить прокси-серверы в командной строке, передав настройки в качестве системных свойств:

java -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=3128 com.baeldung.networking.proxies.CommandLineProxyDemo

При запуске процесса таким образом мы можем просто использовать open Connection() на URL без какой-либо дополнительной работы:

URL url = new URL(RESOURCE_URL);
URLConnection con = url.openConnection();

3.3. Установить С Помощью System.setProperty(Строка, Строка)

Если мы не можем задать свойства прокси в командной строке, мы можем задать их с помощью вызовов System.setProperty() в нашей программе:

System.setProperty("http.proxyHost", "127.0.0.1");
System.setProperty("http.proxyPort", "3128");

URL url = new URL(RESOURCE_URL);
URLConnection con = url.openConnection();
// ...

Если позже мы отключим соответствующие системные свойства вручную, прокси-сервер больше не будет использоваться:

System.setProperty("http.proxyHost", null);

3.4. Ограничения глобальной конфигурации

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

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

В качестве альтернативы Прокси-API обеспечивает более детальный контроль над конфигурацией прокси-сервера.

4. Использование прокси-API

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

Существует три типа прокси-серверов, которые мы можем определить с помощью Прокси.Тип :

  • HTTP – прокси-сервер, использующий протокол HTTP
  • SOCKS – прокси-сервер, использующий протокол SOCKS
  • ПРЯМОЕ – явно настроенное прямое соединение без прокси-сервера

4.1. Использование HTTP-прокси

Чтобы использовать HTTP-прокси, мы сначала обертываем экземпляр SocketAddress с Прокси и типом Proxy.Type.HTTP . Затем мы просто передаем Прокси экземпляр в URLConnection.openConnection():

URL weburl = new URL(URL_STRING);
Proxy webProxy 
  = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 3128));
HttpURLConnection webProxyConnection 
  = (HttpURLConnection) weburl.openConnection(webProxy);

Проще говоря, это означает , что мы подключимся к URL_STRING , но затем направим это соединение через прокси-сервер, размещенный по адресу 127.0.0.1:3128 .

4.2. Использование ПРЯМОГО прокси-сервера

У нас может возникнуть требование для подключения непосредственно к хосту. В этом случае мы можем явно обойти прокси-сервер, который может быть настроен глобально, используя статический экземпляр Proxy.NO_PROXY . Под прикрытием API создает новый экземпляр Proxy для нас, используя Proxy.Type.ПРЯМОЙ как тип :

HttpURLConnection directConnection 
  = (HttpURLConnection) weburl.openConnection(Proxy.NO_PROXY);

В принципе, если нет глобально настроенного прокси-сервера, то это то же самое, что вызвать openConnection() без аргументов.

4.3. Использование прокси-сервера SOCKS

Использование прокси-сервера SOCKS аналогично варианту HTTP при работе с URLConnection. Мы начинаем с упаковки SocketAddress экземпляра с Прокси с использованием типа Proxy.Type.SOCKS . После этого мы передаем экземпляр Прокси в URLConnection.openConnection :

Proxy socksProxy 
  = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress("127.0.0.1", 1080));
HttpURLConnection socksConnection 
  = (HttpURLConnection) weburl.openConnection(socksProxy);

Также возможно использовать прокси-сервер SOCKS при подключении к TCP-сокету . Во-первых, мы используем экземпляр Прокси для создания Сокета . После этого мы передаем адрес назначения Адрес сокета экземпляр в Socket.connect() :

Socket proxySocket = new Socket(socksProxy);
InetSocketAddress socketHost 
  = new InetSocketAddress(SOCKET_SERVER_HOST, SOCKET_SERVER_PORT);
proxySocket.connect(socketHost);

5. Заключение

В этой статье мы рассмотрели, как работать с прокси-серверами в ядре Java.

Во-первых, мы рассмотрели более старый, более глобальный стиль подключения через прокси-серверы с использованием системных свойств. Затем мы увидели, как использовать класс Proxy , который обеспечивает детальный контроль при подключении через прокси-серверы.

Как всегда, весь исходный код, используемый в этой статье, можно найти по адресу на GitHub .