Часто Java-приложение должно подключаться к Интернету. Наиболее распространенный пример происходит, когда он читает файл XML и ему нужно загрузить свою схему.
Я за прокси-сервером. Как я могу настроить свою JVM на использование прокси?
Установите флаги JVM http.proxyHostи http.proxyPortпри запуске JVM в командной строке. Обычно это делается в сценарии оболочки (в Unix) или в файле bat (в Windows). Вот пример со сценарием оболочки Unix:
"proxySet" ничего не делает. Доказательство: установите «false». В JDK такой собственности нет и никогда не было, несмотря на различные книги и онлайн-ссылки. Это произошло от давно не существовавшего HotJavaBean, инкапсулированного браузера, умершего примерно в 1998 году.
Маркиз Лорн,
2
Действительно ли имена свойств без http / https?
Бетлиста
18
Это неправильно по трем причинам: 1: как уже упоминалось, нет элемента "proxySet"; 2: «proxyHost» и «proxyPort» должны быть «http.proxyHost» и «http.proxyPort» (или эквивалентными «https»); 3:. System.getProperties () положим (X, Y) является не такой же , как System.setProperty (X, Y). Но кроме этого - отличный ответ.
@RobCranfill 1: «proxySet» раньше был нестандартным флагом, который был нужен старому JDK, но больше не нужен; 2: «proxyHost» и «proxyPort» работают, «http». префикс просто ограничивает их протоколом HTTP (аналогично «https.»), 3: здесь вы правы.
import java.net.Authenticator;importProxyAuthenticator;publicclassExample{publicstaticvoid main(String[] args){String username =System.getProperty("proxy.authentication.username");String password =System.getProperty("proxy.authentication.password");if(username !=null&&!username.equals("")){Authenticator.setDefault(newProxyAuthenticator(username, password));}// here your JVM will be authenticated}}
это не работает. если вы еще не аутентифицированы, первая строка в основной функции получает кучу нулевых значений, и код останавливается. Это не помогает кому-то аутентифицировать свой jvm, чтобы он мог совершать URL-вызовы через прокси.
Ранднум
12
Сочетание ответов Сортера и Джавабретта / Леонеля:
Установите java.net.useSystemProxiesсвойство в true. Вы можете установить его, например, через переменную среды JAVA_TOOL_OPTIONS . В Ubuntu вы можете, например, добавить следующую строку .bashrc:
Ниже показано, как установить в Java прокси с прокси-пользователем и паролем прокси из командной строки, что является очень распространенным случаем. Не стоит сохранять пароли и хосты в коде, как правило, в первую очередь.
Передача системных свойств в командной строке с помощью -D и установка их в коде с помощью System.setProperty («имя», «значение») эквивалентны.
ProxyUser и proxyPassword - это не системные свойства Java, а свойства HTTP-клиента Apache, поэтому это работает не во всех случаях.
THelper
8
чтение файла XML и необходимо загрузить его схему
Если вы рассчитываете получить схемы или DTD через Интернет, вы создаете медленное, болтливое и хрупкое приложение. Что происходит, когда этот удаленный сервер, на котором размещается файл, берет запланированные или незапланированные простои? Ваше приложение ломается. Это нормально?
URL-адреса для схем и т.п. лучше всего рассматривать как уникальные идентификаторы. Не так, как запросы на удаленный доступ к этому файлу. Выполните поиск в Google по каталогу XML. Каталог XML позволяет размещать такие ресурсы локально, устраняя медлительность, болтливость и хрупкость.
Это в основном постоянно кэшированная копия удаленного контента. И это нормально, так как удаленный контент никогда не изменится. Если когда-нибудь будет обновление, оно будет по другому URL. Делать фактический поиск ресурса через интернет особенно глупо.
Это незначительное обновление, но, начиная с Java 7, прокси-соединения теперь могут создаваться программно, а не через системные свойства. Это может быть полезно, если:
Прокси должен динамически вращаться во время выполнения программы
Необходимо использовать несколько параллельных прокси
Недавно я обнаружил способ разрешить 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;publicabstractclassExtendedProxyManager{privatestaticfinalLog logger =LogFactory.getLog(ExtendedProxyManager.class);/**
* After calling this method, proxy settings can be magically retrieved from default browser settings.
*/publicstaticboolean 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);returnfalse;}returntrue;}}
После этого настройки прокси доступны для API Java через java.net.ProxySelector.
Единственная проблема с этим подходом состоит в том, что вам нужно запустить JVM с помощью deploy.jarbootclasspath, например java -Xbootclasspath/a:"%JAVA_HOME%\jre\lib\deploy.jar" -jar my.jar. Если кто-то знает, как преодолеть это ограничение, дайте мне знать.
Хотелось бы, чтобы я высказал это несколько раз, это единственное решение, которое сработало для меня; Спасибо! Мне пришлось скачать jar-файл регистрации Apache Commons отсюда: commons.apache.org/proper/commons-logging/download_logging.cgi Мой код в Main (): System.setProperty ("java.net.useSystemProxies", "true") ; System.out.println («обнаружение прокси»); ExtendedProxyManager.init ();
Борис
Какое xbootclasspathвлияние окажет указание на deploy.jar, не могу ли я перенести этот jar на мой обычный classpath (при работе без веб-запуска)?
Хаутман
1
в JDK 9 это терпит неудачу :( Exception in thread "main" java.lang.IllegalAccessError: class ...) cannot access class com.sun.deploy.net.proxy.DeployProxySelector (in module jdk.deploy) because module jdk.deploy does not export com.sun.deploy.net.proxy
Этот ответ не дает ничего такого, что еще не было сказано в других ответах.
Саймон Форсберг
1
Как указано в других ответах, если вам нужно использовать прокси-серверы с проверкой подлинности, нет надежного способа сделать это исключительно с помощью переменных командной строки - что раздражает, если вы используете чужое приложение и не хотите связываться с исходный код.
Например, с Proxifier вы можете настроить его только на перехват команд java, которые будут управляться и перенаправляться через его (аутентифицированный) прокси. Однако в этом случае вы захотите установить значения proxyHost и proxyPort пустыми, например, передать -Dhttp.proxyHost= -Dhttp.proxyPort=свои команды Java.
Вы можете использовать переменные http.proxy * JVM, если вы находитесь в автономной JVM, но НЕ ДОЛЖНЫ изменять их сценарии запуска и / или делать это на сервере приложений (за исключением, возможно, jboss или tomcat). Вместо этого вы должны использовать JAVA Proxy API (не System.setProperty) или использовать собственные параметры конфигурации поставщика. Как в WebSphere, так и в WebLogic есть очень определенные способы настройки прокси, которые намного мощнее, чем J2SE. Кроме того, для WebSphere и WebLogic вы, скорее всего, нарушите работу своего сервера приложений, переопределив сценарии запуска (особенно процессы взаимодействия с сервером, поскольку вы, возможно, говорите им также использовать ваш прокси-сервер ...).
Ответы:
Из документации 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:При использовании таких контейнеров, как 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"
)http.proxyUser
иhttp.proxyPassword
не являются системными свойствами Java. Они для HTTP-клиента Apache.https.proxyHost
иhttps.proxyPort
для HTTP.Чтобы использовать настройку прокси системы:
Или программно:
Источник: http://docs.oracle.com/javase/7/docs/api/java/net/doc-files/net-properties.html
источник
Чтобы установить HTTP / HTTPS и / или SOCKS прокси программно:
Помните, что HTTP-прокси и SOCKS-прокси работают на разных уровнях сетевого стека, поэтому вы можете использовать один или другой или оба.
источник
Вы можете установить эти флаги программно следующим образом:
Просто вернуть правильные значения из методов
needsProxy()
,getProxyHost()
и ,getProxyPort()
и вы можете вызвать этот фрагмент кода , когда вы хотите.источник
JVM использует прокси для выполнения HTTP-вызовов
Это может использовать настройки прокси пользователя
источник
System.setProperty
вместоSystem.getProperties().put(...)
Вы можете установить некоторые свойства прокси-сервера в качестве параметров jvm
-Dhttp.proxyPort = 8080, proxyHost и т. Д.
но если вам нужно пройти через прокси-сервер аутентификации, вам нужен такой аутентификатор, как в следующем примере:
ProxyAuthenticator.java
Example.java
На основании этого ответа: 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 прокси с прокси-пользователем и паролем прокси из командной строки, что является очень распространенным случаем. Не стоит сохранять пароли и хосты в коде, как правило, в первую очередь.
Передача системных свойств в командной строке с помощью -D и установка их в коде с помощью System.setProperty («имя», «значение») эквивалентны.
Но учтите это
Пример, который работает:
Но следующее не работает :
Разница лишь в расположении системных свойств! (до и после занятий)
Если у вас есть специальные символы в пароле, вы можете поместить его в кавычки "@ MyPass123%", как в примере выше.
Если вы получаете доступ к службе HTTPS, вы должны использовать
https.proxyHost
иhttps.proxyPort
т. Д.Если вы получаете доступ к службе HTTP, вам придется использовать
http.proxyHost
иhttp.proxyPort
т. Д.источник
Если вы рассчитываете получить схемы или DTD через Интернет, вы создаете медленное, болтливое и хрупкое приложение. Что происходит, когда этот удаленный сервер, на котором размещается файл, берет запланированные или незапланированные простои? Ваше приложение ломается. Это нормально?
См. Http://xml.apache.org/commons/components/resolver/resolver-article.html#s.catalog.files.
URL-адреса для схем и т.п. лучше всего рассматривать как уникальные идентификаторы. Не так, как запросы на удаленный доступ к этому файлу. Выполните поиск в Google по каталогу XML. Каталог XML позволяет размещать такие ресурсы локально, устраняя медлительность, болтливость и хрупкость.
Это в основном постоянно кэшированная копия удаленного контента. И это нормально, так как удаленный контент никогда не изменится. Если когда-нибудь будет обновление, оно будет по другому URL. Делать фактический поиск ресурса через интернет особенно глупо.
источник
Я также за брандмауэром, это сработало для меня!
источник
Если вы хотите «Socks Proxy», сообщите аргументы VM «socksProxyHost» и «socksProxyPort».
например
источник
Добавьте это, прежде чем подключаться к URL-адресу за прокси.
источник
http.proxyUser
иhttp.proxyPassword
не являются системными свойствами Java. Они для HTTP-клиента Apache.System.setProperty
вместоSystem.getProperties().put(...)
Это незначительное обновление, но, начиная с Java 7, прокси-соединения теперь могут создаваться программно, а не через системные свойства. Это может быть полезно, если:
Вот надуманный пример в Groovy:
Полная ссылка: http://docs.oracle.com/javase/7/docs/technotes/guides/net/proxies.html
источник
Недавно я обнаружил способ разрешить JVM использовать настройки прокси браузера. Что вам нужно сделать, это добавить
${java.home}/lib/deploy.jar
в свой проект и запустить библиотеку, как показано ниже:После этого настройки прокси доступны для API Java через
java.net.ProxySelector
.Единственная проблема с этим подходом состоит в том, что вам нужно запустить JVM с помощью
deploy.jar
bootclasspath, напримерjava -Xbootclasspath/a:"%JAVA_HOME%\jre\lib\deploy.jar" -jar my.jar
. Если кто-то знает, как преодолеть это ограничение, дайте мне знать.источник
xbootclasspath
влияние окажет указание на deploy.jar, не могу ли я перенести этот jar на мой обычный classpath (при работе без веб-запуска)?Exception in thread "main" java.lang.IllegalAccessError: class ...) cannot access class com.sun.deploy.net.proxy.DeployProxySelector (in module jdk.deploy) because module jdk.deploy does not export com.sun.deploy.net.proxy
Это подходит для меня:
P / S: Я основываюсь на ответе GHad.
источник
Как указано в других ответах, если вам нужно использовать прокси-серверы с проверкой подлинности, нет надежного способа сделать это исключительно с помощью переменных командной строки - что раздражает, если вы используете чужое приложение и не хотите связываться с исходный код.
Уилл Айверсон (Will Iverson) делает полезное предложение в разделе Использование HttpProxy для подключения к хосту с предварительной аутентификацией для использования инструмента управления Proxy, такого как Proxifier ( http://www.proxifier.com/ для Mac OS X и Windows), для решения этой проблемы .
Например, с Proxifier вы можете настроить его только на перехват команд java, которые будут управляться и перенаправляться через его (аутентифицированный) прокси. Однако в этом случае вы захотите установить значения proxyHost и proxyPort пустыми, например, передать
-Dhttp.proxyHost= -Dhttp.proxyPort=
свои команды Java.источник
Вы можете использовать переменные http.proxy * JVM, если вы находитесь в автономной JVM, но НЕ ДОЛЖНЫ изменять их сценарии запуска и / или делать это на сервере приложений (за исключением, возможно, jboss или tomcat). Вместо этого вы должны использовать JAVA Proxy API (не System.setProperty) или использовать собственные параметры конфигурации поставщика. Как в WebSphere, так и в WebLogic есть очень определенные способы настройки прокси, которые намного мощнее, чем J2SE. Кроме того, для WebSphere и WebLogic вы, скорее всего, нарушите работу своего сервера приложений, переопределив сценарии запуска (особенно процессы взаимодействия с сервером, поскольку вы, возможно, говорите им также использовать ваш прокси-сервер ...).
источник
Я думаю, что настройка WINHTTP также будет работать.
У многих программ, включая Windows Updates, возникают проблемы с прокси-сервером. При настройке WINHTTP всегда будут решаться проблемы такого рода.
источник