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




10 Answers

Из документации 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"
get settings

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

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




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




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

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

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

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



чтение файла XML и его загрузка

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

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

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

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




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

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();



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



Это небольшое обновление, но поскольку 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




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

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.




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

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

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




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




Related


Tags

java   proxy   jvm