java - Как установить прокси-сервер, который будет использоваться JVM




10 Answers

Чтобы использовать настройку прокси-сервера системы:

java -Djava.net.useSystemProxies=true ...

Или программно:

System.setProperty("java.net.useSystemProxies", "true");

Источник: http://docs.oracle.com/javase/7/docs/api/java/net/doc-files/net-properties.html

java proxy jvm

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

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




Вы можете установить эти флаги программно следующим образом:

if (needsProxy()) {
    System.setProperty("http.proxyHost",getProxyHost());
    System.setProperty("http.proxyPort",getProxyPort());
} else {
    System.setProperty("http.proxyHost","");
    System.setProperty("http.proxyPort","");
}

Просто верните правильные значения из методов needsProxy() , getProxyHost() и getProxyPort() и вы можете вызвать этот фрагмент кода всякий раз, когда захотите.




Вы можете установить некоторые свойства прокси-сервера как параметры jvm

-Dhttp.proxyPort = 8080, proxyHost и т. Д.

но если вам нужно пройти через аутентификационный прокси, вам нужен аутентификатор, как этот пример:

ProxyAuthenticator.java

import java.net.*;
import java.io.*;

public class ProxyAuthenticator extends Authenticator {

    private String userName, password;

    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(userName, password.toCharArray());
    }

    public ProxyAuthenticator(String userName, String password) {
        this.userName = userName;
        this.password = password;
    }
}

Example.java

    import java.net.Authenticator;
    import ProxyAuthenticator;

public class Example {

    public static void main(String[] args) {
        String username = System.getProperty("proxy.authentication.username");
        String password = System.getProperty("proxy.authentication.password");

                if (username != null && !username.equals("")) {
            Authenticator.setDefault(new ProxyAuthenticator(username, password));
        }

                // here your JVM will be authenticated

    }
}

На основе этого ответа: http://mail-archives.apache.org/mod_mbox/jakarta-jmeter-user/200208.mbox/%3C494FD350388AD511A9DD00025530F33102F1DC2C@MMSX006%3E




Установите для свойства java.net.useSystemProxies значение true . Вы можете установить его, например, через переменную окружения JAVA_TOOL_OPTIONS . В Ubuntu вы можете, например, добавить следующую строку в .bashrc :

экспорт JAVA_TOOL_OPTIONS + = "-Djava.net.useSystemProxies = true"




Объединяя ответы Сортера и Джавабретта / Леонеля:

java -Dhttp.proxyHost=10.10.10.10 -Dhttp.proxyPort=8080 -Dhttp.proxyUser=username -Dhttp.proxyPassword=password -jar myJar.jar



Ниже показано, как установить в 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 и т. Д.




Недавно я обнаружил, что позволяет JVM использовать настройки прокси-сервера браузера. Вам нужно добавить ${java.home}/lib/deploy.jar в свой проект и ${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;
    }
}

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

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




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

например

java -DsocksProxyHost=127.0.0.1 -DsocksProxyPort=8080 org.example.Main



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

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

Изменить: см. @me.yahoo.com/a/0QMxE's каталога Catalogesolver, в котором используется подход EntityResolver:

CatalogResolver cr = new CatalogResolver();
...
yourParser.setEntityResolver(cr) 



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

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






Related


Tags

java   proxy   jvm