it-swarm-eu.dev

Jak nastavím server proxy, aby jej používal JVM

Aplikace Java se mnohokrát potřebuje připojit k Internetu. Nejběžnějším příkladem je čtení souboru XML a jeho stažení schématu.

Jsem za proxy serverem. Jak mohu nastavit svůj JVM, aby používal proxy?

274
Leonel

Z dokumentace Java ( ne javadoc API):

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

Při spuštění JVM na příkazovém řádku nastavte příznaky JVM http.proxyHost a http.proxyPort. Obvykle se to provádí skriptem Shell (v Unixu) nebo netopýrem (ve Windows). Zde je příklad skriptu Unix Shell:

Java_FLAGS=-Dhttp.proxyHost=10.0.0.100 -Dhttp.proxyPort=8800
Java ${Java_FLAGS} ...

Při použití kontejnerů jako JBoss nebo WebLogic je mým řešením úprava spouštěcích skriptů dodaných prodejcem.

Mnoho vývojářů je obeznámeno s Java API (javadocs), ale mnohokrát je zbytek dokumentace přehlížen. Obsahuje mnoho zajímavých informací: http://download.Oracle.com/javase/6/docs/technotes/guides/


Aktualizace: Pokud nechcete použít proxy k vyřešení některých hostitelů místních/intranetových, podívejte se na komentář od @Tomalak:

Nezapomeňte také na vlastnost http.nonProxyHosts!

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

Použití nastavení systému proxy serveru:

Java -Djava.net.useSystemProxies=true ...

Nebo programově:

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

Zdroj: http://docs.Oracle.com/javase/7/docs/api/Java/net/doc-files/net-properties.html

88
gr5

Chcete-li programově nastavit proxy server HTTP/HTTPS nebo 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;
    }
}

...

Pamatujte, že HTTP proxy a SOCKS proxy fungují na různých úrovních v síťovém zásobníku, takže můžete použít jeden nebo druhý nebo oba.

76
Chris Carruthers

Tyto příznaky můžete nastavit programově takto:

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

Stačí vrátit správné hodnoty z metod needsProxy(), getProxyHost() a getProxyPort() a tento úryvek kódu můžete volat kdykoli budete chtít.

47
GHad

JVM používá proxy k volání HTTP

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

To může používat uživatelské nastavení proxy

System.setProperty("Java.net.useSystemProxies", "true");
19
sarath

Kombinace Sorterových a javabrettových/Leonelových odpovědí:

Java -Dhttp.proxyHost=10.10.10.10 -Dhttp.proxyPort=8080 -Dhttp.proxyUser=username -Dhttp.proxyPassword=password -jar myJar.jar
11
Bamboomy

Můžete nastavit některé vlastnosti serveru proxy jako parametry jvm

-Dhttp.proxyPort = 8080, proxyHost atd.

ale pokud potřebujete projít ověřovacím proxy, potřebujete autentizátor jako je tento příklad:

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

Příklad.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

    }
}

Na základě této odpovědi: http://mail-archives.Apache.org/mod_mbox/jakarta-jmeter-user/200208.mbox/%[email protected]%3E

11
Alex. S.

čtení souboru XML a je třeba si stáhnout jeho schéma

Pokud počítáte s načítáním schémat nebo DTD přes internet, stavíte pomalou, chatrnou a křehkou aplikaci. Co se stane, když vzdálený server hostující soubor zabere plánované nebo neplánované prostoje? Vaše aplikace se zlomí. Je to v pořádku?

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

URL pro schémata a podobně se nejlépe považují za jedinečné identifikátory. Ne jako požadavky na skutečný přístup k tomuto souboru vzdáleně. Udělejte nějaké vyhledávání Google na „katalogu XML“. Katalog XML umožňuje hostovat takové zdroje lokálně a řešit pomalost, chatrnost a křehkost.

Jde v podstatě o trvale uloženou kopii vzdáleného obsahu. A to je v pořádku, protože vzdálený obsah se nikdy nezmění. Pokud by někdy došlo k aktualizaci, byla by na jiné adrese URL. Dělat skutečné načítání zdroje přes internet obzvláště hloupě.

9
John M

Nastavte vlastnost Java.net.useSystemProxies na true. Můžete jej nastavit například prostřednictvím proměnné prostředí Java_TOOL_OPTIONS . V Ubuntu můžete například přidat následující řádek do .bashrc:

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

8
Mihai Capotă

Následující ukazuje, jak nastavit v Java proxy s proxy user a proxy heslo z příkazového řádku, což je velmi častý případ. V kódu byste neměli ukládat hesla a hostitele, zpravidla na prvním místě.

Předávání systémových vlastností v příkazovém řádku pomocí -D a jejich nastavení v kódu pomocí System.setProperty ("name", "value") je ekvivalentní.

Ale všimněte si toho

Příklad, který funguje:

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

Ale následující nefunguje

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

Jediným rozdílem je poloha vlastností systému! (před a po třídě)

Pokud máte speciální znaky v hesle, můžete je vložit do uvozovek "@ MyPass123%", jako v předchozím příkladu.

Pokud přistupujete ke službě HTTPS, musíte použít https.proxyHost, https.proxyPort atd.

Pokud přistupujete ke službě HTTP, musíte použít http.proxyHost, http.proxyPort atd.

7

Také jsem za firewallem, to pro mě fungovalo !!

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

Toto je menší aktualizace, ale protože Java 7, lze nyní proxy připojení vytvářet programově spíše než prostřednictvím systémových vlastností. To může být užitečné, pokud:

  1. Proxy musí být dynamicky rotovány během běhu programu
  2. Je třeba použít více paralelních serverů proxy
  3. Nebo jen vyčistěte kód :)

Zde je vymyšlený příklad v 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()
}

Úplný odkaz: http://docs.Oracle.com/javase/7/docs/technotes/guides/net/proxies.html

4
Philip M.

Pokud chcete "Socks Proxy", informujte argumenty "socksProxyHost" a "socksProxyPort" VM.

např.

Java -DsocksProxyHost=127.0.0.1 -DsocksProxyPort=8080 org.example.Main
4
Marcelo C.

Přidejte toto před připojením k URL za 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");
4
Sorter

Nedávno jsem objevil způsob, jak povolit JVM používat nastavení proxy prohlížeče. Musíte do projektu přidat ${Java.home}/lib/deploy.jar a spustit knihovnu, jako je následující:

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

Poté jsou nastavení proxy k dispozici pro Java API prostřednictvím Java.net.ProxySelector.

Jediným problémem s tímto přístupem je to, že musíte spustit JVM s deploy.jar v bootclasspath např. Java -Xbootclasspath/a:"%Java_HOME%\jre\lib\deploy.jar" -jar my.jar. Pokud někdo ví, jak překonat toto omezení, dejte mi vědět.

3
dma_k

To pro mě funguje:

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: Vycházím z odpovědi GHada.

2
Viet Tran

Jak je zdůrazněno v jiných odpovědích, pokud potřebujete použít ověřené servery proxy, neexistuje spolehlivý způsob, jak to provést čistě pomocí proměnných příkazového řádku - což je nepříjemné, pokud používáte aplikaci někoho jiného a nechcete se bavit s zdrojový kód.

Will Iverson podá užitečný návrh na Použití HttpProxy pro připojení k hostiteli s předběžnou autentizací k použití nástroje pro správu proxy, jako je Proxifier ( http://www.proxifier.com/ pro Mac OS X a Windows).

Například pomocí nástroje Proxifier můžete nastavit, aby zachytával pouze příkazy Java, které mají být spravovány a přesměrovány prostřednictvím (ověřeného) serveru proxy. V tomto případě však budete chtít nastavit hodnoty proxyHost a proxyPort, např. předejte -Dhttp.proxyHost= -Dhttp.proxyPort= vašim Java příkazům.

1
patdevelop

Proměnné http.proxy * JVM můžete použít, pokud jste v samostatném JVM, ale NEMĚLI byste upravovat jejich spouštěcí skripty a/nebo to provádět v aplikačním serveru (kromě možná jboss nebo Tomcat). Místo toho byste měli použít rozhraní Java Proxy API (nikoli System.setProperty) nebo použít vlastní konfigurační možnosti dodavatele. Jak WebSphere, tak WebLogic mají velmi definované způsoby nastavení proxy serverů, které jsou mnohem silnější než J2SE. Navíc pro WebSphere a WebLogic pravděpodobně porušíte aplikační server malými způsoby přepsáním spouštěcích skriptů (zejména interop procesů na serveru, jak byste jim mohli říkat, aby také používali váš proxy ...).

0
user279796

Také, pokud stále hledáte stahování stejného schématu, pak můžete přidat schéma do své cesty do třídy (souborový systém nebo JAR) a poté použít vlastní EntityResolver

Viz zde pro podrobnější diskusi o tomto přístupu.

Upravit: Viz @ me.yahoo.com/a/0QMxE's diskuze o CatalogResolveru, který používá přístup EntityResolver:

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