web-dev-qa-db-ja.com

JVMで使用されるようにプロキシを設定する方法

多くの場合、Javaアプリはインターネットに接続する必要があります。最も一般的な例は、XMLファイルを読み込んでいるときにそのスキーマをダウンロードする必要がある場合に発生します。

私はプロキシサーバーの後ろにいます。プロキシを使用するようにJVMを設定する方法

274
Leonel

Javaのドキュメントから(javadoc API(ではなく):

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

コマンドラインでJVMを起動するときにJVMフラグhttp.proxyHostおよびhttp.proxyPortを設定します。これは通常、シェルスクリプト(UNIXの場合)またはbatファイル(Windowsの場合)で行われます。これがUnixシェルスクリプトの例です。

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

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"
320
Leonel

システムプロキシ設定を使用するには

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

またはプログラム的に:

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

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

88
gr5

HTTP/HTTPSまたは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;
    }
}

...

HTTPプロキシとSOCKSプロキシはネットワークスタックの異なるレベルで動作するので、どちらか一方、または両方を使用できます。

76

これらのフラグをプログラム的にこのように設定することができます。

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

メソッドneedsProxy()getProxyHost()getProxyPort()から正しい値を返すだけで、いつでもこのコードスニペットを呼び出すことができます。

47
GHad

JVMはプロキシを使用してHTTP呼び出しを行います。

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

これはユーザー設定プロキシを使用するかもしれません

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

ソーターとjavabrett/Leonelの答えを組み合わせる:

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

プロキシサーバーに関するいくつかのプロパティをjvmパラメータとして設定できます。

-Dhttp.proxyPort = 8080、proxyHostなど.

しかし、認証プロキシを通過する必要がある場合は、次の例のようなオーセンティケータが必要です。

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

    }
}

この返信に基づく: http://mail-archives.Apache.org/mod_mbox/jakarta-jmeter-user/200208.mbox/%3C494FD350388AD511A9DD00025530F33102F1DC2C@MMSX006%3E

11
Alex. S.

xMLファイルを読み、そのスキーマをダウンロードする必要がある

インターネットを介してスキーマやDTDを取得することを期待しているのであれば、遅くて不愉快で壊れやすいアプリケーションを構築していることになります。ファイルをホストしているそのリモートサーバーが計画的または計画外の停止時間がかかるとどうなりますか?あなたのアプリは壊れます。それは大丈夫ですか?

http://xml.Apache.org/commons/components/resolver/resolver-article.html#s.catalog.files を参照してください。

スキーマなどのURLは、一意の識別子として考えるのが一番です。実際にそのファイルにリモートからアクセスするという要求ではありません。 「XMLカタログ」でGoogle検索を行います。 XMLカタログを使用すると、そのようなリソースをローカルにホストして、低速性、不快感、および脆弱性を解消できます。

これは基本的に、リモートコンテンツの恒久的にキャッシュされたコピーです。リモートコンテンツは変更されないので、これで問題ありません。更新があった場合、それは別のURLにあるでしょう。インターネット上でのリソースの実際の検索を特に愚かにすること。

9
John M

Java.net.useSystemProxies プロパティをtrueに設定します。たとえば、 Java_TOOL_OPTIONS 環境変数を使用して設定できます。 Ubuntuでは、たとえば、.bashrcに次の行を追加できます。

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

8
Mihai Capotă

以下は、Javaでプロキシユーザーとプロキシパスワードを使用してコマンドラインからプロキシを設定する方法を示しています。これは非常に一般的なケースです。そもそも原則として、パスワードとホストをコードに保存しないでください。

コマンドラインで-Dを使用してシステムプロパティを渡し、System.setProperty( "name"、 "value")を使用してコード内でシステムプロパティを設定することは、同等です。

しかしこれに注意してください

動作する例:

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

しかし、次のは動作しません

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

唯一の違いはシステムプロパティの位置です。 (授業前後)

パスワードに特殊文字が含まれている場合は、上記の例のように、 "@ MyPass123%"のように引用符で囲むことができます。

HTTPSサービスにアクセスする場合は、https.proxyHost、https.proxyPortなどを使用する必要があります。

HTTPサービスにアクセスする場合は、http.proxyHost、http.proxyPortなどを使用する必要があります。

私はファイアウォールの向こう側にいます、これは私のために働きました!

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

これはマイナーアップデートですが、Java 7以降、プロキシ接続はシステムプロパティではなくプログラムで作成できるようになりました。次のような場合に便利です。

  1. プログラムの実行時にプロキシを動的に回転させる必要がある
  2. 複数の並列プロキシを使用する必要があります
  3. または単にコードをきれいにする:)

これが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()
}

フルリファレンス: http://docs.Oracle.com/javase/7/docs/technotes/guides/net/proxies.html

4
Philip M.

「Socks Proxy」が必要な場合は、「socksProxyHost」および「socksProxyPort」VM引数に通知してください。

例えば.

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

プロキシの背後にあるURLに接続する前にこれを追加してください。

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

最近、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;

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

その後、プロキシ設定はJava.net.ProxySelectorを通じてJava APIに利用可能になります。

この方法の唯一の問題は、bootclasspathの中のdeploy.jarでJVMを起動する必要があることです。 Java -Xbootclasspath/a:"%Java_HOME%\jre\lib\deploy.jar" -jar my.jar。誰かがこの制限を克服する方法を知っているなら、私に知らせてください。

3
dma_k

それは私のために働く:

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:私はGHadの答えに基づいています。

2
Viet Tran

他の回答で指摘されているように、Authenticated proxyを使用する必要がある場合、純粋にコマンドライン変数を使用してこれを実行する信頼できる方法はありません。ソースコード。

Will Iversonで有益な提案をします。HxpProxyを使用して優先認証 でホストに接続し、Proxifier( これを処理するには、http://www.proxifier.com/ (Mac OS XおよびWindows用)を使用してください。

たとえば、Proxifierを使用すると、管理されている(認証された)プロキシを介してリダイレクトされるJavaコマンドのみを傍受するように設定できます。ただし、この場合はproxyHostとproxyPortの値を空白に設定します。 Javaコマンドに-Dhttp.proxyHost= -Dhttp.proxyPort=を渡します。

1
patdevelop

スタンドアロンのJVM内にいる場合はhttp.proxy * JVM変数を使用できますが、起動スクリプトを変更したり、アプリケーションサーバー内でこれを実行したりしないでください(jbossまたはTomcatを除く)。代わりに、(System.setPropertyではなく)Java Proxy APIを利用するか、ベンダー独自の設定オプションを利用する必要があります。 WebSphereとWebLogicはどちらも、J2SEよりはるかに強力なプロキシを設定する方法を明確に定義しています。さらに、WebSphereとWebLogicの場合は、起動スクリプトをオーバーライドすることによってアプリケーションサーバーをほとんど壊すことはないでしょう(特に、プロキシを使用するように指示されている場合は、サーバーの相互運用プロセスなど)。

0
user279796

また、常に同じスキーマをダウンロードしようとしている場合は、そのスキーマをクラスパス(ファイルシステムまたはJAR)に追加してから、カスタム EntityResolver を使用できます。

このアプローチのより完全な議論については ここ を見てください。

編集:EntityResolverアプローチを使用するCatalogResolverの @ me.yahoo.com/a/0QMxE's の説明を参照してください。

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