JVMが使用するプロキシを設定するにはどうすればよいですか


308

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

プロキシサーバーの背後にいます。プロキシを使用するようにJVMを設定するにはどうすればよいですか?


これに関するOracleのドキュメントはかなり古くなっているようです(ただし、おそらく有効です)。春からより近代的なここでの何か:docs.spring.io/spring-integration/reference/html/...
nobar

回答:


350

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

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

JVMフラグhttp.proxyHostを設定http.proxyPortし、コマンドラインでJVMを起動するときに。これは通常、シェルスクリプト(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"

109
+1。また、http.nonProxyHostsプロパティを忘れないでください!(このように使用:-Dhttp.nonProxyHosts="localhost|127.0.0.1|10.*.*.*|*.foo.com|etc"
Tomalak 2010

3
こんにちは皆さん、これにユーザー名とパスワードをどのように含めることができますか?ありがとう
Joeblackdev

8
@Joeblackdevがhttp.proxyUserとhttp.proxyPasswordを確認
aasukisuki

4
@aasukisuki http.proxyUserhttp.proxyPasswordJavaシステムプロパティではありません。これらはApache HTTPクライアント用です。
ローンの侯爵

24
また、設定するために忘れてはいけないhttps.proxyHosthttps.proxyPortHTTPSの。
C-Otto

103

システムプロキシセットアップを使用するには:

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


素晴らしい設定のjvm引数は、チャームのように私に
はたらき

このコードを使用して、SSLSocketの「false」値でプロキシを無効にしました。ありがとう。
2015

1
多分それは私のプロキシが認証を必要とするためですが、これは私にとってはうまくいきませんでした。よかったです。
Simon Forsberg、

3
これはProxy Auto-Config(PAC)ファイルでは機能しません。stackoverflow.com
questions /

80

プログラムで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プロキシはネットワークスタックのさまざまなレベルで動作するため、どちらか一方または両方を使用できることに注意してください。


4
「java.net.socks.username / password」が設定されている場合、なぜ認証システム設定するのですか?
ローンの侯爵

1
「con.setRequest ...」ではない理由は、conが認識されないためです。これにはどのライブラリが必要ですか。
Randnum

1
socksプロキシオプションの+1は、httpプロキシでも問題を解決できないことがあります
manuzhang

1
私のテストでは、デフォルトのオーセンティケーターを設定するだけで機能します。認証プロパティを設定する必要はありません
Drew Stephens

1
システムプロパティのみでは機能しません。java.net.socks。(username | password)プロパティは何もしないと考えます。
ドリュースティーブンス

46

これらのフラグは、次のようにプログラムで設定できます。

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

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


34
「proxySet」は何もしません。プルーフ:「false」に設定します。JDK、さまざまな書籍、オンラインリファレンスには、そのようなプロパティはありません。これは、およそ1998年に死亡し死亡した、カプセル化されたブラウザ、長期亡きHotJavaBeanから来た
ローン侯爵

2
プロパティ名は本当にhttp / httpsなしですか?
Betlista 2012

18
これは3つの点で間違っています。1:前述のように、「proxySet」項目はありません。2:「proxyHost」と「proxyPort」は、「http.proxyHost」と「http.proxyPort」(または「https」と同等)である必要があります。3:System.getProperties()。put(X、Y)はSystem.setProperty(X、Y)と同じではありません。それ以外は-素晴らしい答えです。
Rob Cranfill 2013年


1
@RobCranfill 1:「proxySet」は、古いJDKで必要であった非標準のフラグでしたが、もはや必要ありません。2:「proxyHost」と「proxyPort」は機能しますが、「http」です。プレフィックスは、それらをHTTPプロトコルに制限するだけです( "https。"の場合と同様)。3:ここで正しいです。
toolforger 2018年

24

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

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

これはユーザー設定プロキシを使用する場合があります

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

System.setProperty代わりに使用System.getProperties().put(...)
Simon Forsberg

12

プロキシサーバーに関するいくつかのプロパティを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


これは動作しません。まだ認証されていない場合、メイン関数の最初の行が一連のnull値を取得し、コードが停止します。これは、誰かがjvmを認証して、プロキシを介してURL呼び出しを行えるようにするのには役立ちません。
Randnum

12

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

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


9

次は、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.proxyHosthttps.proxyPortなどを使用する必要があります。

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


5
ProxyUserとproxyPasswordはJavaシステムプロパティではありませんが、Apache HTTPクライアントプロパティなので、すべてのケースでこれが機能するわけではありません。
THelper

8

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

インターネット経由でスキーマまたはDTDを取得することを期待している場合は、遅くておしゃべりで壊れやすいアプリケーションを構築しています。ファイルをホストしているリモートサーバーで計画的または計画外のダウンタイムが発生するとどうなりますか?アプリが壊れます。それは大丈夫ですか?

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

スキーマなどのURLは、一意の識別子と考えるのが最適です。実際にそのファイルにリモートでアクセスするためのリクエストではありません。「XMLカタログ」でGoogle検索を行ってください。XMLカタログを使用すると、このようなリソースをローカルでホストして、遅延、おしゃべり、および脆弱性を解決できます。

これは基本的に、リモートコンテンツの永続的にキャッシュされたコピーです。そして、リモートコンテンツは決して変更されないため、これで問題ありません。更新がある場合は、別のURLにあります。特にばかげて、インターネット上で実際にリソースを取得すること。


7

私もファイアウォールの背後にいます。これでうまくいきました。

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

5

「Socks Proxy」が必要な場合は、「socksProxyHost」および「socksProxyPort」VM引数を通知します。

例えば

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

4

プロキシの背後にある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
http.proxyUserそして、http.proxyPasswordJavaシステムプロパティではありません。これらはApache HTTPクライアント用です。
ローンの侯爵

System.setProperty代わりに使用System.getProperties().put(...)
Simon Forsberg

4

これはマイナーな更新ですが、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


2
これは、1.7ではなくJava 1.5以降です。
ローン侯爵

3

最近、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 APIで使用できますjava.net.ProxySelector

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


1
私はこれを何度も賛成できればいいのですが、これが私にとって有効な唯一の解決策です。ありがとうございました!ここからApache Commons Logging jarをダウンロードする必要がありました:commons.apache.org/proper/commons-logging/download_logging.cgi Main()の私のコード:System.setProperty( "java.net.useSystemProxies"、 "true") ; System.out.println( "detecting proxies"); ExtendedProxyManager.init();
Boris

xbootclasspathdeploy.jarへのポインティングはどのような効果がありますか?そのjarを通常のクラスパス(webstartなしで実行している場合)に取得できませんでしたか?
Houtman

1
JDK 9では失敗します:(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
Houtman

2

それは私にとってはうまくいきます:

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


この回答では、他の回答でまだ述べられていないことは何も提供されていません。
Simon Forsberg、

1

他の回答で指摘されているように、Authenticatedプロキシを使用する必要がある場合、コマンドライン変数を使用してこれを行う信頼できる方法はありません。これは、他の誰かのアプリケーションを使用していて、ソースコード。

ウィル・アイバーソンは、HttpProxyを使用して高速認証でホストに接続し、 Proxifier(Mac OS XおよびWindowsの場合はhttp://www.proxifier.com/)などのプロキシ管理ツールを使用してこれを処理するのに役立つ提案を行います。

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


-1

スタンドアロンのJVM内にいる場合は、http.proxy * JVM変数を利用できますが、それらの起動スクリプトを変更したり、アプリケーションサーバー(jbossやtomcatを除く)内でこれを変更するべきではありません。代わりに、(System.setPropertyではなく)JAVAプロキシAPIを使用するか、ベンダー独自の構成オプションを使用する必要があります。WebSphereとWebLogicの両方で、J2SEよりもはるかに強力なプロキシを設定する方法が非常に明確に定義されています。さらに、WebSphereとWebLogicの場合、起動スクリプト(特に、プロキシも使用するように指示している可能性があるサーバーの相互運用プロセス)をオーバーライドすることで、アプリケーションサーバーを少しの方法で破壊する可能性があります。


-5

WINHTTPの設定も機能すると思います。

Windows Updateを含む多くのプログラムで、プロキシの背後に問題が発生しています。WINHTTPを設定すると、この種の問題は常に修正されます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.