- Подключение через прокси-серверы в ядре Java
- 1. введение
- 2. Настройка
- 3. Использование глобальной настройки
- 3.1. Доступные Системные свойства
- 3.2. Установка с помощью Аргументов командной строки
- 3.3. Установить С Помощью System.setProperty(Строка, Строка)
- 3.4. Ограничения глобальной конфигурации
- 4. Использование прокси-API
- 4.1. Использование HTTP-прокси
- 4.2. Использование ПРЯМОГО прокси-сервера
- 4.3. Использование прокси-сервера SOCKS
- 5. Заключение
- Setting Up Proxy Connection to a System in Java
Подключение через прокси-серверы в ядре Java
Узнайте, как подключаться к прокси-серверам на Java с помощью системных свойств или более гибкого класса прокси.
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 .
Setting Up Proxy Connection to a System in Java
In today’s networking environments, categorically corporate ones, application developers have to deal with proxies virtually as often as system administrators. In some cases the application should utilize the system default settings, in other cases, it will be additive to have very tight control over what goes through which proxy, and, somewhere in the middle, most applications will be ecstatic to delegate the decision to their users by providing them with a GUI to set the proxy settings, as is the case in most browsers.
Proxy servers act as interfaces between client applications and other servers. In an enterprise setting, we often use them to help provide control over the content that users consume, usually across network boundaries.
We will figure out two ways by which we can connect across proxy servers in java which are as follows:
- Legacy approach that is JVM-wide and configured with system properties.
- Using Proxy class which provides more control by permitting configuration on the basis of each connection.
Method 1: Using a Global Setting
Java exhibits a set of system properties that can be used to set up the JVM-wide behavior. This “universal” approach is often the simplest to implement if it is appropriate for the use case. We can set the required properties from the command line during the invocation of the JVM. Alternatively, we can also define them using System.setProperty() at runtime. Here’s how to define them using the command line as shown below:
2.1. Set via Command Line Arguments
We can define proxies at the command line bypassing the parameters as system properties:
java -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=8080 com.geeksforgeeks.networking.proxies.CommandLineProxyDemo
When starting a process that way, we can just use openConnection() on the URL with no extra work:
URL url = new URL(RESOURCE_URL);
URLConnection con = url.openConnection();
2.3 Set Proxy Using the System.setProperty() method
If there are problems when using the command line, there is another way to do this using the System.setProperty() method. To set up a proxy.
System.setProperty(“http.proxyHost”, “127.0.0.1”);
System.setProperty(“http.proxyPort”, “8080”);
URL url = new URL(RESOURCE_URL);
URLConnection con = url.openConnection();
// …
If we then manually disable the relevant system properties, then the proxy will not be used anymore:
Now with this there do comes limitations of global configuration which is as described further.
- The global configuration approach is the easiest way to define the proxy, but there are certain limitations to this approach.
- This approach provides the implementation on the JVM-wide, so the settings define for a particular protocol are active for the life of the JVM or until we unset them manually.
Note: To get over this limitation, it may be attractive to flip the settings on and off, if needed. But, it would be necessary to ensure the measures to protect against concurrency issues in a multi-threaded program.
So, as an alternative, the Proxy API is more efficient and provides more control over proxy configuration. As an alternative, the Proxy API provides more granular control over proxy configuration. This gives out birth to another approach that via Proxy API
Method 2: Using the Proxy API
The Proxy class gives us a flexible way to configure proxies on a per-connection basis. If there are any existing JVM-wide proxy settings, connection-based proxy settings using the Proxy class will override them. Here are three types of proxies that we can define by Proxy Type:
- HTTP is a proxy using the HTTP protocol
- SOCKS is a proxy using the SOCKS protocol
- DIRECT is an explicitly configured direct connection without a proxy
(A) Using an HTTP Proxy
To use an HTTP proxy, we first wrap a SocketAddress instance with a Proxy and type of Proxy.Type.HTTP. Next, we simply pass the Proxy instance to URLConnection.openConnection():
URL weburl = new URL(URL_STRING);
Proxy webProxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(“127.0.0.1”, 8080));
HttpURLConnection webProxyConnection = (HttpURLConnection) weburl.openConnection(webProxy);
Now, we’ll connect to URL_STRING but then route that connection through a proxy server hosted at 127.0.0.1:8080.
(B) Using a DIRECT Proxy
We may have a requirement to connect directly to a host. In this case, we can explicitly bypass a proxy that may be configured globally by using the static Proxy.NO_PROXY instance. Under the covers, the API constructs a new instance of Proxy for us, using Proxy.Type.DIRECT as the type:
HttpURLConnection directConnection = (HttpURLConnection) weburl.openConnection(Proxy.NO_PROXY);
(C) Using a SOCKS Proxy
The Socks proxy works similarly to the HTTP variant while dealing with URLConnection. In Socks proxy, first, we wrap a SocketAddress instance with a Proxy using the Proxy.Type.SOCKS type. After that, the Proxy instance is passed to URLConnection.openConnection.
Proxy socksProxy = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress(“127.0.0.1”, 1080));
HttpURLConnection socksConnection = (HttpURLConnection) weburl.openConnection(socksProxy);
It’s also possible to use a SOCKS proxy when connecting to a TCP socket. First, we use the Proxy instance to construct a Socket. Afterward, we pass the destination SocketAddress instance to Socket.connect() as follows:
Socket proxySocket = new Socket(socksProxy);
InetSocketAddress socketHost = new InetSocketAddress(SOCKET_SERVER_HOST, SOCKET_SERVER_PORT);