回答:
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"
http.nonProxyHosts
プロパティを忘れないでください!(このように使用:-Dhttp.nonProxyHosts="localhost|127.0.0.1|10.*.*.*|*.foo.com|etc"
)
http.proxyUser
とhttp.proxyPassword
Javaシステムプロパティではありません。これらはApache HTTPクライアント用です。
https.proxyHost
とhttps.proxyPort
HTTPSの。
システムプロキシセットアップを使用するには:
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
プログラムで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プロキシはネットワークスタックのさまざまなレベルで動作するため、どちらか一方または両方を使用できることに注意してください。
これらのフラグは、次のようにプログラムで設定できます。
if (needsProxy()) {
System.setProperty("http.proxyHost",getProxyHost());
System.setProperty("http.proxyPort",getProxyPort());
} else {
System.setProperty("http.proxyHost","");
System.setProperty("http.proxyPort","");
}
ただ、メソッドから正しい値を返すneedsProxy()
、getProxyHost()
そしてgetProxyPort()
、あなたはいつでもあなたは、このコードスニペットを呼び出すことができます。
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(...)
プロキシサーバーに関するいくつかのプロパティを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
java.net.useSystemProxies
プロパティをに設定しますtrue
。たとえば、JAVA_TOOL_OPTIONS環境変数を使用して設定できます。Ubuntuでは、たとえば、次の行をに追加できます.bashrc
。
エクスポートJAVA_TOOL_OPTIONS + = "-Djava.net.useSystemProxies = true"
次は、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
などを使用する必要があります。
XMLファイルを読み取り、そのスキーマをダウンロードする必要がある
インターネット経由でスキーマまたはDTDを取得することを期待している場合は、遅くておしゃべりで壊れやすいアプリケーションを構築しています。ファイルをホストしているリモートサーバーで計画的または計画外のダウンタイムが発生するとどうなりますか?アプリが壊れます。それは大丈夫ですか?
http://xml.apache.org/commons/components/resolver/resolver-article.html#s.catalog.filesを参照してください
スキーマなどのURLは、一意の識別子と考えるのが最適です。実際にそのファイルにリモートでアクセスするためのリクエストではありません。「XMLカタログ」でGoogle検索を行ってください。XMLカタログを使用すると、このようなリソースをローカルでホストして、遅延、おしゃべり、および脆弱性を解決できます。
これは基本的に、リモートコンテンツの永続的にキャッシュされたコピーです。そして、リモートコンテンツは決して変更されないため、これで問題ありません。更新がある場合は、別のURLにあります。特にばかげて、インターネット上で実際にリソースを取得すること。
私もファイアウォールの背後にいます。これでうまくいきました。
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();
プロキシの背後にある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");
http.proxyUser
そして、http.proxyPassword
Javaシステムプロパティではありません。これらはApache HTTPクライアント用です。
System.setProperty
代わりに使用System.getProperties().put(...)
これはマイナーな更新ですが、Java 7以降、システム接続ではなくプログラムでプロキシ接続を作成できるようになりました。これは次の場合に役立ちます。
これが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
最近、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
。誰かがこの制限を克服する方法を知っている場合は、私に知らせてください。
xbootclasspath
deploy.jarへのポインティングはどのような効果がありますか?そのjarを通常のクラスパス(webstartなしで実行している場合)に取得できませんでしたか?
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
それは私にとってはうまくいきます:
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の答えに基づいています。
他の回答で指摘されているように、Authenticatedプロキシを使用する必要がある場合、コマンドライン変数を使用してこれを行う信頼できる方法はありません。これは、他の誰かのアプリケーションを使用していて、ソースコード。
ウィル・アイバーソンは、HttpProxyを使用して高速認証でホストに接続し、 Proxifier(Mac OS XおよびWindowsの場合はhttp://www.proxifier.com/)などのプロキシ管理ツールを使用してこれを処理するのに役立つ提案を行います。
たとえば、Proxifierを使用すると、(認証された)プロキシを介して管理およびリダイレクトされるjavaコマンドのみをインターセプトするように設定できます。ただし、この場合、proxyHostとproxyPortの値を空白に設定する必要があり-Dhttp.proxyHost= -Dhttp.proxyPort=
ます。たとえば、Javaコマンドに渡します。
スタンドアロンのJVM内にいる場合は、http.proxy * JVM変数を利用できますが、それらの起動スクリプトを変更したり、アプリケーションサーバー(jbossやtomcatを除く)内でこれを変更するべきではありません。代わりに、(System.setPropertyではなく)JAVAプロキシAPIを使用するか、ベンダー独自の構成オプションを使用する必要があります。WebSphereとWebLogicの両方で、J2SEよりもはるかに強力なプロキシを設定する方法が非常に明確に定義されています。さらに、WebSphereとWebLogicの場合、起動スクリプト(特に、プロキシも使用するように指示している可能性があるサーバーの相互運用プロセス)をオーバーライドすることで、アプリケーションサーバーを少しの方法で破壊する可能性があります。