Frage

Oft muss eine Java-Anwendung mit dem Internet verbinden. Das häufigste Beispiel passiert, wenn es eine XML-Datei liest und muss das Schema zum Download bereit.

Ich bin hinter einem Proxy-Server. Wie kann ich meine JVM den Proxy verwenden?

War es hilfreich?

Lösung

Von der Java-Dokumentation ( nicht die javadoc API):

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

Stellen Sie die JVM-Flags http.proxyHost und http.proxyPort wenn Ihre JVM auf der Kommandozeile starten. Dies wird in der Regel in einem Shell-Skript (in Unix) oder bitten-Datei (unter Windows) durchgeführt. Hier ist das Beispiel mit dem Unix-Shell-Skript:

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

Wenn Container wie JBoss oder WebLogic verwenden, meine Lösung ist, die Start-up-Skripte vom Hersteller geliefert zu bearbeiten.

Viele Entwickler sind vertraut mit der Java API (javadocs), aber oft der Rest der Dokumentation übersehen wird. Es enthält viele interessante Informationen: http://download.oracle.com/ JavaSE / 6 / docs / technotes / guides /


Update: Wenn Sie nicht wollen, Proxy verwenden einige lokale / Intranet-Hosts zu beheben, überprüfen Sie den Kommentar von @Tomalak:

  

Vergessen Sie auch nicht die http.nonProxyHosts Eigenschaft!

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

Andere Tipps

, um den System-Proxy-Setup verwenden:

java -Djava.net.useSystemProxies=true ...

oder programmatisch:

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

Quelle: http://docs.oracle .com / JavaSE / 7 / docs / api / java / net / doc-Dateien / net-properties.html

So stellen Sie eine HTTP / HTTPS und / oder SOCKS-Proxy programmatisch:

...

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;
    }
}

...

Denken Sie daran, dass die HTTP-Proxies und SOCKS-Proxies auf verschiedenen Ebenen im Netzwerk-Stack arbeiten, so können Sie eine oder die andere oder beide verwenden.

Sie können diese Flags programmatisch auf diese Weise festgelegt:

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

Just Rückkehr der richtigen Werte aus den Methoden needsProxy(), getProxyHost() und getProxyPort() und Sie können diesen Code-Schnipsel nennen, wann immer Sie wollen.

JVM verwendet die Proxy-HTTP-Anrufe tätigen

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

Dies kann Benutzereinstellung Proxy verwenden

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

Sie können einige Eigenschaften über den Proxy-Server als Jvm Parameter

-Dhttp.proxyPort = 8080, proxyhost, etc.

, aber wenn Sie über einen Authentifizierungs-Proxy passieren müssen, benötigen Sie einen Authentifikator wie in diesem Beispiel:

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

    }
}

zu dieser Antwort Basierend: http: // E-Mail-Archive. apache.org/mod_mbox/jakarta-jmeter-user/200208.mbox/%3C494FD350388AD511A9DD00025530F33102F1DC2C@MMSX006%3E

Die Kombination Sorter ist und javabrett / Leonel die Antworten:

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

Lesen einer XML-Datei und muss das Schema herunterladen

Wenn Sie zum Abrufen von Schemata oder DTDs über das Internet zählen, sind bauen Sie eine langsame, gesprächig, fragile Anwendung. Was passiert, wenn der Remote-Server die Datei-Hosting-Takes geplante oder ungeplante Ausfallzeiten? Ihre App bricht. Ist das OK?

Siehe http: //xml.apache .org / commons / components / Resolver / Resolver-article.html # s.catalog.files

URL für Schemata und dergleichen sind am besten als eindeutige Kennungen. Nicht als Anforderungen für den Zugriff auf diese Datei tatsächlich die Ferne. Sie einige der Google-Suche auf „XML-Katalog“. Ein XML-Katalog ermöglicht es Ihnen, diese Ressourcen vor Ort zu hosten, die Lösung die Langsamkeit, Geschwätzigkeit und Zerbrechlichkeit.

Es ist im Grunde eine dauerhaft gespeicherte Kopie des Remote-Inhalts. Und das ist in Ordnung, da der Remote-Inhalt wird sich nie ändern. Wenn es jemals ein Update, würde es an einer anderen URL sein. Macht den tatsächlichen Abruf der Ressource über das Internet vor allem dumm.

Stellen Sie den java.net.useSystemProxies Eigenschaft true. Sie können es zum Beispiel durch die JAVA_TOOL_OPTIONS Umgebungsvariable. In Ubuntu, können Sie zum Beispiel die folgende Zeile .bashrc:

  

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

Ich bin auch hinter einer Firewall, das ist für mich gearbeitet !!

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

Im Folgenden wird gezeigt, wie in Java einen Proxy mit Proxy-Benutzer und Proxy-Passwort in der Befehlszeile setzen, die ein sehr häufiger Fall ist. Sie sollten keine Kennwörter und Hosts im Code speichern, in der Regel an erster Stelle.

Passing die Systemeigenschaften in Befehlszeile mit -D und sie in den Code mit System.setProperty Einstellung ( "Name", "Value") entspricht.

Beachten Sie jedoch, diese

Beispiel, das funktioniert:

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

Aber die folgende funktioniert nicht

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

Der einzige Unterschied ist die Lage der Systemeigenschaften! (Vor und nach der Klasse)

Wenn Sie Sonderzeichen im Passwort haben, sind Sie berechtigt, es in Anführungszeichen „@ MyPass123%“, wie im obigen Beispiel.

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.

Fügen Sie diese, bevor Sie eine URL hinter einem Proxy verbinden.

System.getProperties().put("http.proxyHost", "someProxyURL");
System.getProperties().put("http.proxyPort", "someProxyPort");
System.getProperties().put("http.proxyUser", "someUserName");
System.getProperties().put("http.proxyPassword", "somePassword");

Dies ist ein kleines Update, aber da Java 7 können Proxy-Verbindungen nun programmatisch und nicht durch Systemeigenschaften erzeugt werden. Dies kann nützlich sein, wenn:

  1. muss Proxy dynamisch während der Programmlaufzeit
  2. gedreht werden
  3. Mehrere parallele Proxies verwendet werden müssen
  4. Oder einfach nur den Code sauberer machen:)

Hier ist ein konstruiertes Beispiel in 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()
}

Voll Referenz: http://docs.oracle.com/javase/7 /docs/technotes/guides/net/proxies.html

Wenn Sie "SOCKS-Proxy" möchten, informieren Sie das "socksProxyHost" und "socksProxyPort" VM Argumente.

z.

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

Vor kurzem habe ich die Art und Weise entdeckt JVM zu ermöglichen Browser Proxy-Einstellungen zu verwenden. Was Sie tun müssen, ist ${java.home}/lib/deploy.jar zu einem Projekt hinzuzufügen und die Bibliothek wie folgt init:

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;
    }
}

Danach sind die Proxy-Einstellungen auf Java API über java.net.ProxySelector zur Verfügung.

Das einzige Problem bei diesem Ansatz ist, dass Sie JVM mit deploy.jar in bootclasspath zum Beispiel starten müssen java -Xbootclasspath/a:"%JAVA_HOME%\jre\lib\deploy.jar" -jar my.jar. Wenn jemand weiß, wie diese Einschränkung zu überwinden, lassen Sie es mich wissen.

Das funktioniert für mich:

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:. Ich gründe auf ghad Antwort

Wie in anderen Antworten darauf hingewiesen, wenn Sie authentifizierten Proxies verwenden muß, gibt es keine zuverlässige Möglichkeit, dies zu tun, rein Befehlszeilenvariablen - was ärgerlich ist, wenn Sie mit jemandem anderer Anwendung und wollen nicht Chaos mit dem Quellcode.

Will Iverson macht die hilfreiche Anregung über Httpproxy Verwendung mit einem Host mit preemtive Authentifizierung verbindet ein Proxy-Management-Tool wie Proxifier verwenden ( http://www.proxifier.com/ für Mac OS X und Windows) zu handhaben.

Zum Beispiel mit Proxifier Sie es bis zu nur abfangen java festlegen können Befehle verwaltet und durch seine (authentifiziert) Proxy umgeleitet werden. Du wirst die proxyhost und proxy Werte leer in diesem Fall allerdings einstellen wollen, zum Beispiel Pass in -Dhttp.proxyHost= -Dhttp.proxyPort= auf Ihre Java-Befehle.

Auch wenn man immer schauen, um das gleiche Schema herunterladen, dann können Sie das Schema Classpath (Dateisystem oder JAR) hinzufügen und dann ein benutzerdefinierten verwenden EntityResolver

Siehe hier für eine vollständigere Diskussion dieses Ansatzes.

Edit: Siehe @ me.yahoo.com / a / 0QMxE der Diskussion CatalogResolver, die verwendet der EntityResolver Ansatz:

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

Sie können die http.proxy * JVM Variablen verwenden, wenn Sie innerhalb einer eigenständigen JVM sind, aber Sie sollten ihre NICHT Startskripts und / oder tun dies in Ihrem Anwendungsserver ändern (außer vielleicht Jboss oder Tomcat). Stattdessen sollten Sie die Java-Proxy-API (nicht System.setProperty) nutzen oder des Verkäufers eigene Konfigurationsoptionen nutzen. Sowohl WebSphere und WebLogic sind sehr definiert Möglichkeiten, die Proxies einrichten, der eine weitaus mächtiger als die J2SE sind. Zusätzlich wird für WebSphere und WebLogic werden Sie wahrscheinlich Ihre Anwendungsserver in wenig Möglichkeiten brechen, indem sie die Startskripts überschrieben (insbesondere die Interop Prozesse des Servers, wie Sie vielleicht ihnen erzählen Ihrem Proxy zu verwenden, wie gut ...).

Ich denke, das Konfigurieren winhttp wird auch funktionieren.

Viele Programme, einschließlich Windows-Updates sind Probleme hinter Proxy haben. Durch die Einrichtung von winhttp wird immer behebt diese Art von Problemen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top