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

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

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

Ответы [ 20 ]

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

Из документации Java ( не API javadoc):

http://download.oracle.com/javase/6/docs/technotes/guides/net/proxies.html

Установите флаги JVM http.proxyHost и http.proxyPort при запуске JVM в командной строке. Обычно это делается в сценарии оболочки (в Unix) или в файле bat (в Windows). Вот пример со сценарием оболочки Unix:

JAVA_FLAGS=-Dhttp.proxyHost=10.0.0.100 -Dhttp.proxyPort=8800
java ${JAVA_FLAGS} ...

При использовании таких контейнеров, как JBoss или WebLogic, мое решение заключается в редактировании сценариев запуска, предоставляемых поставщиком.

Многие разработчики знакомы с Java API (javadocs), но во многих случаях остальная часть документации игнорируется. Содержит много интересной информации: http://download.oracle.com/javase/6/docs/technotes/guides/


Обновление: Если вы не хотите использовать прокси для разрешения некоторых локальных / интрасетевых хостов, ознакомьтесь с комментарием @Tomalak:

Также не забудьте свойство http.nonProxyHosts!

-Dhttp.nonProxyHosts="localhost|127.0.0.1|10.*.*.*|*.foo.com‌​|etc"
88 голосов
/ 17 июля 2012

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

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

76 голосов
/ 26 сентября 2008

Чтобы программно установить прокси 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-прокси работают на разных уровнях сетевого стека, поэтому вы можете использовать один или другой или оба.

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

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

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

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

19 голосов
/ 13 января 2015

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

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

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

System.setProperty("java.net.useSystemProxies", "true");
11 голосов
/ 23 сентября 2008

Вы можете установить некоторые свойства прокси-сервера в качестве параметров 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

10 голосов
/ 12 июля 2017

Сочетание ответов Сортера и Джавабретта / Леонеля:

java -Dhttp.proxyHost=10.10.10.10 -Dhttp.proxyPort=8080 -Dhttp.proxyUser=username -Dhttp.proxyPassword=password -jar myJar.jar
9 голосов
/ 23 сентября 2008

читает файл XML и должен загрузить его схему

Если вы рассчитываете получить схемы или DTD через Интернет, вы создаете медленное, болтливое, хрупкое приложение. Что происходит, когда этот удаленный сервер, на котором размещен файл, берет запланированные или незапланированные простои? Ваше приложение ломается. Это нормально?

См. http://xml.apache.org/commons/components/resolver/resolver-article.html#s.catalog.files

URL-адреса для схем и т.п. лучше всего рассматривать как уникальные идентификаторы. Не так, как запросы на удаленный доступ к этому файлу. Выполните поиск в Google по каталогу XML. Каталог XML позволяет размещать такие ресурсы локально, устраняя медлительность, болтливость и хрупкость.

Это в основном постоянно кэшированная копия удаленного контента. И это нормально, так как удаленный контент никогда не изменится. Если когда-нибудь будет обновление, оно будет по другому URL. Делать поиск ресурса через Интернет особенно глупо.

8 голосов
/ 11 сентября 2015

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

export JAVA_TOOL_OPTIONS + = "-Djava.net.useSystemProxies = true"

7 голосов
/ 06 сентября 2012

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

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...