Как настроить прокси для использования JVM - PullRequest
272 голосов
/ 23 сентября 2008

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

Я за прокси-сервером. Как я могу настроить свою JVM на использование прокси?

Ответы [ 20 ]

7 голосов
/ 26 января 2017

Ниже показано, как установить в Java прокси с пользователем прокси и паролем прокси из командной строки, что является очень распространенным случаем. Не стоит сохранять пароли и хосты в коде, как правило, в первую очередь.

Передача системных свойств в командной строке с помощью -D и установка их в коде с помощью System.setProperty («имя», «значение») эквивалентны.

Но учтите это

Пример, который работает:

C:\temp>java -Dhttps.proxyHost=host -Dhttps.proxyPort=port -Dhttps=proxyUser=user -Dhttps.proxyPassword="password" -Djavax.net.ssl.trustStore=c:/cacerts -Djavax.net.ssl.trustStorePassword=changeit com.andreas.JavaNetHttpConnection

Но следующее не работает

C:\temp>java com.andreas.JavaNetHttpConnection -Dhttps.proxyHost=host -Dhttps.proxyPort=port -Dhttps=proxyUser=user -Dhttps.proxyPassword="password" -Djavax.net.ssl.trustStore=c:/cacerts -Djavax.net.ssl.trustStorePassword=changeit

Единственное отличие - это положение системных свойств! (до и после занятий)

Если у вас есть специальные символы в пароле, вы можете поместить его в кавычки "@ MyPass123%", как в приведенном выше примере.

Если вы получаете доступ к службе HTTPS, вам нужно использовать https.proxyHost, https.proxyPort и т. Д.

Если вы обращаетесь к службе HTTP, вы должны использовать http.proxyHost, http.proxyPort и т. Д.

4 голосов
/ 01 декабря 2017

Если вы хотите использовать «Socks Proxy», сообщите аргументы VM «socksProxyHost» и «socksProxyPort».

, например

java -DsocksProxyHost=127.0.0.1 -DsocksProxyPort=8080 org.example.Main
4 голосов
/ 21 октября 2012

Добавьте это, прежде чем подключаться к URL-адресу за прокси.

System.getProperties().put("http.proxyHost", "someProxyURL");
System.getProperties().put("http.proxyPort", "someProxyPort");
System.getProperties().put("http.proxyUser", "someUserName");
System.getProperties().put("http.proxyPassword", "somePassword");
4 голосов
/ 02 октября 2015

Это небольшое обновление, но начиная с Java 7, прокси-соединения теперь могут создаваться программно, а не через системные свойства. Это может быть полезно, если:

  1. Прокси должен динамически вращаться во время выполнения программы
  2. Необходимо использовать несколько параллельных прокси
  3. Или просто сделайте свой код чище:)

Вот надуманный пример в groovy:

// proxy configuration read from file resource under "proxyFileName"
String proxyFileName = "proxy.txt"
String proxyPort = "1234"
String url = "http://www.promised.land"
File testProxyFile = new File(proxyFileName)
URLConnection connection

if (!testProxyFile.exists()) {

    logger.debug "proxyFileName doesn't exist.  Bypassing connection via proxy."
    connection = url.toURL().openConnection()

} else {
    String proxyAddress = testProxyFile.text
    connection = url.toURL().openConnection(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyAddress, proxyPort)))
}

try {
    connection.connect()
}
catch (Exception e) {
    logger.error e.printStackTrace()
}

Полная ссылка: http://docs.oracle.com/javase/7/docs/technotes/guides/net/proxies.html

3 голосов
/ 09 марта 2010

Недавно я обнаружил способ разрешить JVM использовать настройки прокси браузера. Что вам нужно сделать, это добавить ${java.home}/lib/deploy.jar в ваш проект и запустить библиотеку следующим образом:

import com.sun.deploy.net.proxy.DeployProxySelector;
import com.sun.deploy.services.PlatformType;
import com.sun.deploy.services.ServiceManager;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public abstract class ExtendedProxyManager {

    private static final Log logger = LogFactory.getLog(ExtendedProxyManager.class);

    /**
     * After calling this method, proxy settings can be magically retrieved from default browser settings.
     */
    public static boolean init() {
        logger.debug("Init started");

        // Initialization code was taken from com.sun.deploy.ClientContainer:
        ServiceManager
                .setService(System.getProperty("os.name").toLowerCase().indexOf("windows") != -1 ? PlatformType.STANDALONE_TIGER_WIN32
                        : PlatformType.STANDALONE_TIGER_UNIX);

        try {
            // This will call ProxySelector.setDefault():
            DeployProxySelector.reset();
        } catch (Throwable throwable) {
            logger.error("Unable to initialize extended dynamic browser proxy settings support.", throwable);

            return false;
        }

        return true;
    }
}

Впоследствии настройки прокси доступны для API Java через java.net.ProxySelector.

Единственная проблема этого подхода в том, что вам нужно запустить JVM с deploy.jar в bootclasspath, например. java -Xbootclasspath/a:"%JAVA_HOME%\jre\lib\deploy.jar" -jar my.jar. Если кто-то знает, как преодолеть это ограничение, дайте мне знать.

2 голосов
/ 03 июля 2014

Это работает для меня:

public void setHttpProxy(boolean isNeedProxy) {
    if (isNeedProxy) {
        System.setProperty("http.proxyHost", getProxyHost());
        System.setProperty("http.proxyPort", getProxyPort());
    } else {
        System.clearProperty("http.proxyHost");
        System.clearProperty("http.proxyPort");
    }
}

P / S: Я основываюсь на ответе GHad.

1 голос
/ 20 декабря 2012

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

Уилл Айверсон делает полезное предложение на Использование HttpProxy для подключения к хосту с предварительной проверкой подлинности для использования инструмента управления прокси, такого как Proxifier (http://www.proxifier.com/ для Mac OS X и Windows), чтобы справиться с этим.

Например, с Proxifier вы можете настроить его на перехват только команд Java, которые будут управляться и перенаправляться через его (аутентифицированный) прокси. Вы хотите установить пустые значения proxyHost и proxyPort в этом случае, например, передайте -Dhttp.proxyHost= -Dhttp.proxyPort= вашим командам Java.

0 голосов
/ 23 сентября 2008

Кроме того, если вы всегда хотите загрузить одну и ту же схему, вы можете добавить схему в ваш classpath (файловую систему или JAR), а затем использовать пользовательский EntityResolver

См. здесь для более полного обсуждения этого подхода.

Редактировать: см. @me.yahoo.com/a/0QMxE's обсуждение CatalogResolver, который использует подход EntityResolver:

CatalogResolver cr = new CatalogResolver();
...
yourParser.setEntityResolver(cr) 
0 голосов
/ 23 февраля 2010

Вы можете использовать переменные http.proxy * JVM, если вы находитесь в автономной JVM, но НЕ ДОЛЖНЫ изменять их сценарии запуска и / или делать это на сервере приложений (за исключением, возможно, jboss или tomcat). Вместо этого вы должны использовать JAVA Proxy API (не System.setProperty) или использовать собственные параметры конфигурации поставщика. Как в WebSphere, так и в WebLogic есть очень определенные способы настройки прокси, которые намного мощнее, чем J2SE. Кроме того, для WebSphere и WebLogic вы, скорее всего, сломаете свой сервер приложений небольшими способами, переопределив сценарии запуска (особенно процессы взаимодействия сервера, так как вы, возможно, говорите им также использовать ваш прокси-сервер ...).

0 голосов
/ 04 ноября 2011

Я думаю, что настройка WINHTTP также будет работать.

Многие программы, в том числе Windows Updates, имеют проблемы с прокси-сервером. При настройке WINHTTP всегда будут решаться проблемы такого рода

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...