Oft muss eine Java-App eine Verbindung zum Internet herstellen. Das häufigste Beispiel tritt auf, wenn eine XML-Datei gelesen wird und das Schema heruntergeladen werden muss.
Ich bin hinter einem Proxyserver. Wie kann ich meine JVM so einstellen, dass sie den Proxy verwendet?
Antworten:
Aus der Java-Dokumentation ( nicht der Javadoc-API):
http://download.oracle.com/javase/6/docs/technotes/guides/net/proxies.html
Setzen Sie die JVM-Flags
http.proxyHost
undhttp.proxyPort
starten Sie Ihre JVM in der Befehlszeile. Dies erfolgt normalerweise in einem Shell-Skript (unter Unix) oder einer Bat-Datei (unter Windows). Hier ist das Beispiel mit dem Unix-Shell-Skript:Bei Verwendung von Containern wie JBoss oder WebLogic besteht meine Lösung darin, die vom Hersteller bereitgestellten Startskripts zu bearbeiten.
Viele Entwickler sind mit der Java-API (Javadocs) vertraut, aber der Rest der Dokumentation wird oft übersehen. Es enthält viele interessante Informationen: http://download.oracle.com/javase/6/docs/technotes/guides/
Update: Wenn Sie keinen Proxy zum Auflösen einiger lokaler / Intranet-Hosts verwenden möchten, lesen Sie den Kommentar von @Tomalak:
quelle
http.nonProxyHosts
Eigenschaft! (Verwendung wie folgt aus :-Dhttp.nonProxyHosts="localhost|127.0.0.1|10.*.*.*|*.foo.com|etc"
)http.proxyUser
undhttp.proxyPassword
sind keine Java-Systemeigenschaften. Sie sind für den Apache HTTP-Client.https.proxyHost
undhttps.proxyPort
für HTTPs.So verwenden Sie das System-Proxy-Setup:
Oder programmatisch:
Quelle: http://docs.oracle.com/javase/7/docs/api/java/net/doc-files/net-properties.html
quelle
So legen Sie programmgesteuert einen HTTP / HTTPS- und / oder SOCKS-Proxy fest:
Denken Sie daran, dass HTTP-Proxys und SOCKS-Proxys auf verschiedenen Ebenen im Netzwerkstapel ausgeführt werden, sodass Sie den einen oder den anderen oder beide verwenden können.
quelle
Sie können diese Flags programmgesteuert folgendermaßen setzen:
Geben Sie einfach die richtigen Werte aus den Methoden zurück
needsProxy()
,getProxyHost()
undgetProxyPort()
Sie können dieses Code-Snippet jederzeit aufrufen.quelle
JVM verwendet den Proxy, um HTTP-Aufrufe zu tätigen
Dies kann einen Benutzereinstellungs-Proxy verwenden
quelle
System.setProperty
anstelle vonSystem.getProperties().put(...)
Sie können einige Eigenschaften des Proxyservers als JVM-Parameter festlegen
-Dhttp.proxyPort = 8080, proxyHost usw.
Wenn Sie jedoch einen authentifizierenden Proxy durchlaufen müssen, benötigen Sie einen Authentifikator wie das folgende:
ProxyAuthenticator.java
Beispiel.java
Basierend auf dieser Antwort: http://mail-archives.apache.org/mod_mbox/jakarta-jmeter-user/200208.mbox/%3C494FD350388AD511A9DD00025530F33102F1DC2C@MMSX006%3E
quelle
Kombinieren Sie die Antworten von Sorter und Javabrett / Leonel:
quelle
Setzen Sie die
java.net.useSystemProxies
Eigenschaft auftrue
. Sie können dies beispielsweise über die Umgebungsvariable JAVA_TOOL_OPTIONS festlegen . In Ubuntu können Sie beispielsweise die folgende Zeile hinzufügen.bashrc
:quelle
Im Folgenden wird gezeigt, wie in Java ein Proxy mit Proxy-Benutzer und Proxy-Kennwort über die Befehlszeile festgelegt wird. Dies ist ein sehr häufiger Fall. Sie sollten in der Regel in erster Linie keine Passwörter und Hosts im Code speichern.
Das Übergeben der Systemeigenschaften in der Befehlszeile mit -D und das Festlegen im Code mit System.setProperty ("Name", "Wert") ist äquivalent.
Beachten Sie dies jedoch
Beispiel, das funktioniert:
Aber folgendes funktioniert nicht :
Der einzige Unterschied ist die Position der Systemeigenschaften! (vor und nach dem Unterricht)
Wenn das Passwort Sonderzeichen enthält, können Sie es wie im obigen Beispiel in Anführungszeichen "@ MyPass123%" setzen.
Wenn Sie einen HTTPS - Dienst zugreifen, müssen Sie verwenden
https.proxyHost
,https.proxyPort
usw.Wenn Sie einen HTTP - Dienst zugreifen, müssen Sie verwenden
http.proxyHost
,http.proxyPort
usw.quelle
Wenn Sie darauf zählen, Schemas oder DTDs über das Internet abzurufen, erstellen Sie eine langsame, gesprächige und fragile Anwendung. Was passiert, wenn der Remote-Server, auf dem sich die Datei befindet, geplante oder ungeplante Ausfallzeiten benötigt? Ihre App bricht ab. Ist das in Ordnung?
Siehe http://xml.apache.org/commons/components/resolver/resolver-article.html#s.catalog.files
URLs für Schemas und dergleichen werden am besten als eindeutige Bezeichner angesehen. Nicht als Anforderung, tatsächlich remote auf diese Datei zuzugreifen. Führen Sie eine Google-Suche im "XML-Katalog" durch. Mit einem XML-Katalog können Sie solche Ressourcen lokal hosten und so Langsamkeit, Geschwätz und Fragilität beheben.
Es ist im Grunde eine permanent zwischengespeicherte Kopie des Remote-Inhalts. Und das ist in Ordnung, da sich der Remote-Inhalt niemals ändern wird. Wenn es jemals ein Update gibt, wird es unter einer anderen URL sein. Das eigentliche Abrufen der Ressource über das Internet besonders dumm zu machen.
quelle
Ich bin auch hinter der Firewall, das hat bei mir funktioniert !!
quelle
Wenn Sie "Socks Proxy" möchten, informieren Sie die VM-Argumente "socksProxyHost" und "socksProxyPort".
z.B
quelle
Fügen Sie dies hinzu, bevor Sie eine Verbindung zu einer URL hinter einem Proxy herstellen.
quelle
http.proxyUser
undhttp.proxyPassword
sind keine Java-Systemeigenschaften. Sie sind für den Apache HTTP-Client.System.setProperty
anstelle vonSystem.getProperties().put(...)
Dies ist ein kleines Update, aber seit Java 7 können Proxy-Verbindungen jetzt programmgesteuert und nicht mehr über Systemeigenschaften erstellt werden. Dies kann nützlich sein, wenn:
Hier ist ein erfundenes Beispiel in Groovy:
Vollständige Referenz: http://docs.oracle.com/javase/7/docs/technotes/guides/net/proxies.html
quelle
Kürzlich habe ich herausgefunden, wie JVM Browser-Proxy-Einstellungen verwenden kann. Was Sie tun müssen, ist,
${java.home}/lib/deploy.jar
Ihrem Projekt etwas hinzuzufügen und die Bibliothek wie folgt zu initiieren:Anschließend stehen die Proxy-Einstellungen der Java API über zur Verfügung
java.net.ProxySelector
.Das einzige Problem bei diesem Ansatz ist, dass Sie JVM mit
deploy.jar
in bootclasspath starten müssen, zjava -Xbootclasspath/a:"%JAVA_HOME%\jre\lib\deploy.jar" -jar my.jar
. Wenn jemand weiß, wie er diese Einschränkung überwinden kann, lassen Sie es mich wissen.quelle
xbootclasspath
Hinweis auf deploy.jar für die Wirkung? Könnte ich dieses Glas nicht auf meinen normalen Klassenpfad übertragen (wenn es ohne Webstart ausgeführt wird)?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
Das ist für mich in Ordnung:
P / S: Ich stütze mich auf GHads Antwort.
quelle
Wie in anderen Antworten ausgeführt, gibt es keine zuverlässige Möglichkeit, authentifizierte Proxys zu verwenden, wenn Sie authentifizierte Proxys verwenden. Dies ist ärgerlich, wenn Sie die Anwendung eines anderen Benutzers verwenden und sich nicht mit dem herumspielen möchten Quellcode.
Will Iverson macht den hilfreichen Vorschlag unter Verwenden von HttpProxy, um eine Verbindung zu einem Host mit vorläufiger Authentifizierung herzustellen , um ein Proxy-Verwaltungstool wie Proxifier ( http://www.proxifier.com/ für Mac OS X und Windows) zu verwenden, um dies zu handhaben.
Mit Proxifier können Sie beispielsweise festlegen, dass nur Java-Befehle abgefangen werden, die über den (authentifizierten) Proxy verwaltet und umgeleitet werden sollen. In diesem Fall sollten Sie jedoch die Werte für proxyHost und proxyPort auf leer setzen, z. B.
-Dhttp.proxyHost= -Dhttp.proxyPort=
an Ihre Java-Befehle übergeben.quelle
Sie können die http.proxy * JVM-Variablen verwenden, wenn Sie sich in einer eigenständigen JVM befinden, aber Sie sollten deren Startskripte NICHT ändern und / oder dies auf Ihrem Anwendungsserver tun (außer vielleicht jboss oder tomcat). Verwenden Sie stattdessen die JAVA-Proxy-API (nicht System.setProperty) oder die Konfigurationsoptionen des Herstellers. Sowohl WebSphere als auch WebLogic verfügen über sehr definierte Methoden zum Einrichten der Proxys, die weitaus leistungsfähiger sind als die von J2SE. Darüber hinaus werden Sie für WebSphere und WebLogic Ihren Anwendungsserver wahrscheinlich auf geringfügige Weise beschädigen, indem Sie die Startskripte überschreiben (insbesondere die Interop-Prozesse des Servers, da Sie ihn möglicherweise anweisen, auch Ihren Proxy zu verwenden ...).
quelle
Ich denke, die Konfiguration von WINHTTP wird auch funktionieren.
Viele Programme, einschließlich Windows-Updates, haben Probleme mit dem Proxy. Durch das Einrichten von WINHTTP werden diese Probleme immer behoben
quelle