ネットワーク環境:
setPropertyによるHttpsURLConnectionの使用方法
HTTPSクライアント< =============>プロキシサーバー< ==============> HTTPSサーバ
192.168.17.11 < ----- ------エクストラネット> 192.168.17.22
10.100.21.10 < ----イントラネット-----> 10.10 0.21.11は、PS:デフォルトゲートウェイ無しのHTTPクライアントが、それが10.100.21.11
説明にpingできる:
OS:Ubuntuの12.04 3上のホスト
HTTPSクライアント: java(openjdk-6)を実装する。一つのネットワークインタフェースを持つ。
Proxy Server:Apache2.2.Have 2つのネットワークインターフェイス。
Httpsサーバー:Tomcat6.Have 1つのネットワークインターフェイス。
私はプロキシを介してのHttpsURLConnectionを実装するための2つのメソッドを使用します(促進のために、私はをチェックするためにSSLハンドル機能について書き留めていないとのHostnameVerifier issue.IfをserverTrusted
は私が更新する必要があります。 )
1.Proxyクラス
InetSocketAddress proxyInet = new InetSocketAddress("10.100.21.11",80);
Proxy proxy = new Proxy(Proxy.Type.HTTP, proxyInet);
URL httpsUrl = new URL("https://192.168.17.22:8443/test");
HttpsURLConnection httpsCon = (HttpsURLConnection) httpsUrl.openConnection(proxy);
httpsCon.setDoOutput(true);
httpsCon.setDoInput(true);
httpsCon.setRequestMethod("POST");
OutputStream out = httpsCon.getOutputStream();
OutputStreamWriter owriter = new OutputStreamWriter(out);
owriter.write("<request>test</request>");
owriter.flush();
owriter.close();
...
この方法は実行可能であり、パケットフローも私の期待を満たしていることがわかりました。
のHttpClient --->のProxyServer ---> HttpServerを
しかし、私はsetプロパティメソッドを使用する場合:
2.setProperty
System.setProperty("http.proxySet", "true");
System.setProperty("http.proxyHost",10.100.21.11);
System.setProperty("http.proxyPort","80");
URL httpsUrl = new URL("https://192.168.17.22:8443/test");
HttpsURLConnection httpsCon = (HttpsURLConnection)httpsUrl.openConnection();
httpsCon.setDoOutput(true);
httpsCon.setDoInput(true);
httpsCon.setRequestMethod("POST");
OutputStream out = httpsCon.getOutputStream();
OutputStreamWriter owriter = new OutputStreamWriter(out);
owriter.write("<request>test</request>");
owriter.flush();
owriter.close();
...
を私はNoRouteToHostException: Network is unreachable
を得ました。
それは私を混乱させます。私はHttpClientとProxyServerの間にパケットを見ませんでした。
しかし、HttpClientを
は、だから私は(プロキシを使用しないよう)プロキシ設定を削除するのProxyServer(10.100.12.10ピング10.100.21.11)にpingを実行することができます:
もNoRouteToHostException: Network is unreachable
を得ました。
これは合理的だと思いました。エクストラネットへのルートがないためです。
は、私はそれがのHttpsURLConnectionの内部機能意志が到達可能であってもなくてもよい、このURLをチェックするのsetProperty方法にように思えると思います。
しかしそれは変です。第一の方法は成功する可能性があります。
ご存知ですか?または、第1方法と第2方法の違いは何ですか?
+++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++
更新
System.setProperty("https.proxyHost",10.100.21.11);
System.setProperty("https.proxyPort","80");
それは働くことができるとパケットの流れは、私が期待正しいです。
しかしhttps.proxyPort = 443に設定それは怒鳴るように例外をthorowます私のため
System.setProperty("https.proxyPort","443");
実行可能ではありません。
java.net.SocketException: Unexpected end of file from server
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:770)
....
だから私は、Apacheのプロキシがまた右の設定に変更する必要があると思いました。
をHTTPとしてはそのようなプロパティはありません.proxySet。 – EJP
はい。このプロパティは実際には設定する必要はありません。ありがとう〜 – CJeremy