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



Answers

Чтобы программно настроить прокси-сервер HTTP / HTTPS и / или SOCKS:

...

public void setProxy() {
    if (isUseHTTPProxy()) {
        // HTTP/HTTPS Proxy
        System.setProperty("http.proxyHost", getHTTPHost());
        System.setProperty("http.proxyPort", getHTTPPort());
        System.setProperty("https.proxyHost", getHTTPHost());
        System.setProperty("https.proxyPort", getHTTPPort());
        if (isUseHTTPAuth()) {
            String encoded = new String(Base64.encodeBase64((getHTTPUsername() + ":" + getHTTPPassword()).getBytes()));
            con.setRequestProperty("Proxy-Authorization", "Basic " + encoded);
            Authenticator.setDefault(new ProxyAuth(getHTTPUsername(), getHTTPPassword()));
        }
    }
    if (isUseSOCKSProxy()) {
        // SOCKS Proxy
        System.setProperty("socksProxyHost", getSOCKSHost());
        System.setProperty("socksProxyPort", getSOCKSPort());
        if (isUseSOCKSAuth()) {
            System.setProperty("java.net.socks.username", getSOCKSUsername());
            System.setProperty("java.net.socks.password", getSOCKSPassword());
            Authenticator.setDefault(new ProxyAuth(getSOCKSUsername(), getSOCKSPassword()));
        }
    }
}

...

public class ProxyAuth extends Authenticator {
    private PasswordAuthentication auth;

    private ProxyAuth(String user, String password) {
        auth = new PasswordAuthentication(user, password == null ? new char[]{} : password.toCharArray());
    }

    protected PasswordAuthentication getPasswordAuthentication() {
        return auth;
    }
}

...

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

Question

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

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




Добавьте это, прежде чем подключаться к 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");



JVM использует прокси для совершения HTTP-вызовов

System.getProperties().put("http.proxyHost", "someProxyURL");
System.getProperties().put("http.proxyPort", "someProxyPort");

Это может использовать пользовательский прокси-сервер

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



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




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

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

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




Это подходит для меня:

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.




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

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




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

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

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




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




Я тоже за брандмауэром, это сработало для меня !!

System.setProperty("http.proxyHost", "proxy host addr");
System.setProperty("http.proxyPort", "808");
Authenticator.setDefault(new Authenticator() {
    protected PasswordAuthentication getPasswordAuthentication() {

        return new PasswordAuthentication("domain\\user","password".toCharArray());
    }
});

URL url = new URL("http://www.google.com/");
URLConnection con = url.openConnection();

BufferedReader in = new BufferedReader(new InputStreamReader(
                    con.getInputStream()));

// Read it ...
String inputLine;
while ((inputLine = in.readLine()) != null)
    System.out.println(inputLine);

in.close();





Related



Tags

java java   proxy   jvm