Hoe stel ik de proxy in die door de JVM moet worden gebruikt

Vaak moet een Java-app verbinding maken met internet. Het meest voorkomende voorbeeld doet zich voor wanneer het een XML-bestand leest en het bijbehorende schema moet downloaden.

Ik zit achter een proxyserver. Hoe kan ik mijn JVM instellen om de proxy te gebruiken?


Antwoord 1, autoriteit 100%

Uit de Java-documentatie (nietde javadoc API):

http://download.oracle.com/ javase/6/docs/technotes/guides/net/proxy’s.html

Stel de JVM-vlaggen http.proxyHosten http.proxyPortin bij het starten van uw JVM op de opdrachtregel.
Dit gebeurt meestal in een shellscript (in Unix) of bat-bestand (in Windows). Hier is het voorbeeld met het Unix-shellscript:

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

Als ik containers zoals JBoss of WebLogic gebruik, is mijn oplossing om de opstartscripts te bewerken die door de leverancier zijn geleverd.

Veel ontwikkelaars zijn bekend met de Java API (javadocs), maar vaak wordt de rest van de documentatie over het hoofd gezien. Het bevat veel interessante informatie: http://download.oracle.com/ javase/6/docs/technotes/guides/


Update:Als je geen proxy wilt gebruiken om sommige lokale/intranet-hosts op te lossen, bekijk dan de opmerking van @Tomalak:

Vergeet ook de eigenschap http.nonProxyHosts niet!

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

Antwoord 2, autoriteit 31%

De systeemproxyconfiguratie gebruiken:

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

Of programmatisch:

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

Bron: http://docs.oracle .com/javase/7/docs/api/java/net/doc-files/net-properties.html


Antwoord 3, autoriteit 23%

Een HTTP/HTTPS- en/of SOCKS-proxy programmatisch instellen:

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

Vergeet niet dat HTTP-proxies en sokken proxies op verschillende niveaus in de netwerkstack werken, zodat u een of de andere of beide kunt gebruiken.


Antwoord 4, Autoriteit 13%

U kunt die vlaggen programmatisch op deze manier instellen:

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

Retourneer de juiste waarden uit de methoden needsProxy(), getProxyHost()EN getProxyPort()EN U kunt deze code fragment noemen wanneer je maar wilt.


Antwoord 5, Autoriteit 7%

JVM gebruikt de proxy om HTTP-oproepen

te maken

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

Dit kan de gebruikersinstelling proxy

gebruiken

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

Antwoord 6, Autoriteit 4%

Antwoorden met Sorter’s en Javabrett / Leonel:

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

Antwoord 7, Autoriteit 3%

U kunt sommige eigenschappen instellen over de proxyserver als JVM-parameters

-dhttp.proxyport = 8080, proxyhost, enz.

Maar als u door een authenticerende proxy nodig hebt, hebt u een authenticator nodig zoals dit voorbeeld:

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

Op basis van dit antwoord:
http: // Mail-Archives. apache.org/mod_mbox/jakarta-jmeter-user/200208.meter/%3c494fd350388AD511A9D00025530F33102F1DC2C@MMSX006%3E


Antwoord 8, Autoriteit 3%

Stel de java.net.useSystemProxiesonroerend goed naar true. Je kunt het bijvoorbeeld instellen via de java_tool_options Milieuvariabele. In Ubuntu kunt u bijvoorbeeld de volgende regel toevoegen aan .bashrc:

Exporteer Java_Tool_options + = “-djava.net.usesystemProxies = True”


Antwoord 9, Autoriteit 3%

Hieronder laat zien hoe u in Java een proxy instelt met Proxy-gebruiker en proxy-wachtwoord van de opdrachtregel, wat een zeer algemeen geval is. U moet geen wachtwoorden en hosts in de code opslaan, in de regel in de eerste plaats.

Voer de eigenschappen van het systeem in opdrachtregel met -d en instellen ze in de code met System.SetProperty (“Naam”, “Value”) is equivalent.

maar noteer dit

Voorbeeld dat werkt:

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

Maar de volgende werkt niet :

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

Het enige verschil is de positie van de eigenschappen van het systeem! (vóór en na de klas)

Als u speciale tekens in het wachtwoord heeft, mag u dit tussen aanhalingstekens “@MyPass123%” zetten, zoals in het bovenstaande voorbeeld.

Als u een HTTPS-service gebruikt, moet u https.proxyHost, https.proxyPortenz. gebruiken.

Als u een HTTP-service gebruikt, moet u http.proxyHost, http.proxyPortenz. gebruiken.


Antwoord 10, autoriteit 2%

een XML-bestand leest en het schema ervan moet downloaden

Als je erop rekent schema’s of DTD’s via internet op te halen, bouw je een trage, spraakzame, kwetsbare applicatie. Wat gebeurt er als die externe server die het bestand host, geplande of ongeplande uitvaltijd heeft? Je app gaat kapot. Is dat oké?

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

URL’s voor schema’s en dergelijke kunnen het beste worden gezien als unieke id’s. Niet als verzoeken om daadwerkelijk op afstand toegang te krijgen tot dat bestand. Zoek eens op Google op “XML-catalogus”. Met een XML-catalogus kunt u dergelijke bronnen lokaal hosten, waardoor de traagheid, spraakzaamheid en kwetsbaarheid worden opgelost.

Het is in feite een permanent in de cache opgeslagen kopie van de externe inhoud. En dat is OK, aangezien de externe inhoud nooit zal veranderen. Als er ooit een update is, is dat op een andere URL. Het daadwerkelijke ophalen van de bron via internet bijzonder dom maken.


Antwoord 11, autoriteit 2%

Ik zit ook achter de firewall, dit werkte voor mij!!

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("https://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();

Antwoord 12, autoriteit 2%

Als je “Socks Proxy” wilt, geef dan de argumenten “socksProxyHost” en “socksProxyPort” van de VM door.

bijv.

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

Antwoord 13

Voeg dit toe voordat u verbinding maakt met een URL achter een proxy.

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

Antwoord 14

Dit is een kleine update, maar sinds Java 7 kunnen proxyverbindingen nu programmatisch worden gemaakt in plaats van via systeemeigenschappen. Dit kan handig zijn als:

  1. Proxy moet dynamisch worden gedraaid tijdens de looptijd van het programma
  2. Meerdere parallelle proxy’s moeten worden gebruikt
  3. Of maak je code gewoon schoner 🙂

Hier is een gekunsteld voorbeeld 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()
}

Volledige referentie:
http://docs.oracle.com/javase/7 /docs/technotes/guides/net/proxy’s.html


Antwoord 15

Onlangs heb ik de manier ontdekt om JVM toe te staan browserproxy-instellingen te gebruiken. Wat u moet doen, is ${java.home}/lib/deploy.jaraan uw project toevoegen en de bibliotheek als volgt initiëren:

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

Daarna zijn de proxy-instellingen beschikbaar voor Java API via java.net.ProxySelector.

Het enige probleem met deze aanpak is dat je JVM moet starten met deploy.jarin bootclasspath, b.v. java -Xbootclasspath/a:"%JAVA_HOME%\jre\lib\deploy.jar" -jar my.jar. Als iemand weet hoe deze beperking te overwinnen, laat het me weten.


Antwoord 16

Dat werkt voor mij:

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: Ik baseer me op het antwoord van GHad.


Antwoord 17

Zoals in andere antwoorden is aangegeven, is er geen betrouwbare manier om dit te doen als u Geauthenticeerde proxy’s moet gebruiken, alleen met behulp van opdrachtregelvariabelen – wat vervelend is als u de toepassing van iemand anders gebruikt en dat niet wilt knoeien met de broncode.

Will Iverson maakt de handige suggestie over op Gebruik HTTPPROXY om verbinding te maken met een host met preemtive-authentication om een ​​proxy-managementtool te gebruiken, zoals proxifier ( http://www.proxifier.com/ voor Mac OS X en Windows) om dit aan te pakken.

Bijvoorbeeld met proxifier kunt u het instellen om alleen de JAVA-opdrachten te onderscheiden om te worden beheerd en doorverwezen via zijn (geverifieerde) proxy. Je wilt de proxyhost- en proxyport-waarden in dit geval instellen, b.v. Pas in -Dhttp.proxyHost= -Dhttp.proxyPort=naar uw Java-opdrachten.


Antwoord 18

U kunt de HTTP.PROXY * JVM-variabelen gebruiken als u binnen een stand-alone JVM bevindt, maar u mag hun opstartscripts niet wijzigen en / of dit doen binnen uw toepassingsserver (behalve JBOSS of TOMCAT). In plaats daarvan zou je de Java Proxy API (Not System.SetProperty) moeten gebruiken of de eigen configuratie-opties van de leverancier gebruiken. Zowel WebSphere en Weblogic hebben zeer gedefinieerde manieren om de proxy’s op te zetten die veel krachtiger zijn dan de J2SE. Bovendien, voor WebSphere en WebLogic, zult u waarschijnlijk op kleine manieren uw toepassingsserver breken door de opstartscripts (met name de interopprocessen van de server te overschrijven, omdat u ze misschien vertelt dat ze uw proxy ook kunnen gebruiken …).


Antwoord 19

Ik vind het configureren van winhttp zal ook werken.

Veel programma’s inclusief Windows-updates hebben problemen achter de volmacht. Door in te stellen Winhttp zal dit soort problemen altijd repareren

Other episodes