2008-09-23 5 views
233

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

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

+0

код [Oracle документация] (https://docs.oracle.com/javase/8/docs/technotes/guides/net/proxies.html) вокруг этого кажется довольно несвежий (хотя, вероятно, еще в силе). Вот что-то более современное из Spring: https://docs.spring.io/spring-integration/reference/html/http.html#http-proxy – nobar 2017-10-25 14:01:22

ответ

281

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

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

Установите JVM флаги http.proxyHost и http.proxyPort при запуске виртуальной машины Java в командной строке. Обычно это делается в сценарии оболочки (в 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/


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

Also don't forget the http.nonProxyHosts property!

-Dhttp.nonProxyHosts="localhost|127.0.0.1|10.*.*.*|*.foo.com‌​|etc" 
+84

+1. Также не забудьте свойство `http.nonProxyHosts`! (используйте так: `-Dhttp.nonProxyHosts =" localhost | 127.0.0.1 | 10. *. *. * | * .foo.com | etc "`) – Tomalak 2010-12-21 19:44:35

+1

Привет, ребята, как вы можете включить имя пользователя и пароль в это также? Спасибо – Joeblackdev 2011-03-01 21:21:08

+7

@Joeblackdev посмотреть http.proxyUser и http.proxyPassword – aasukisuki 2011-04-15 20:06:19

37

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

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

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

+0

Почему этот пост был проголосован? Это законный Java-код и подходит к этому вопросу. Пожалуйста, объясните – GHad 2008-09-23 13:10:25

+2

Похоже на приличный ответ мне +1 – serg10 2008-09-23 14:59:50

8

reading an XML file and needs to download its schema

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

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

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

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

0

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

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

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

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

Вы можете установить некоторые свойства о прокси-сервере в качестве параметров 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/%[email protected]%3E

70

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

0

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

3

Недавно я обнаружил, что позволяет 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; 
    } 
} 

После настройки прокси-сервера доступны для Java API с помощью java.net.ProxySelector.

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

-3

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

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

7

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

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

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

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

Will Iverson делает полезное предложение более в Using HttpProxy to connect to a host with preemtive authentication использовать инструмент прокси-управления, такие как Proxifier (http://www.proxifier.com/ для Mac OS X и Windows), чтобы справиться с этим.

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

3

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

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 в.

10

JVM использует прокси-сервер, чтобы сделать HTTP вызовы

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

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

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

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

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

4

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

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

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

// 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

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

3

Комбинирование javabrett/ответы Леонель в сортировщик-х и:

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

Если вы хотите "Socks Proxy", уведомляющее "SocksProxyHost" и аргументы "SocksProxyPort" VM.

например.

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