- - PR -
HttpsURLConnectionを使用したプロキシ経由の接続について
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-11-24 12:02
初めて投稿させていただきます。
HttpsURLConnectionを使用してプロキシ経由の場合とプロキシ経由でない場合を 切り替えてりクエストの送信をおこないたいと思ってます ○プロキシ経由の場合: System.setProperty("https.proxySet", "true"); System.setProperty("https.proxyHost", "xxxx"); System.setProperty("https.proxyPort", "xxxx"); としたあと URLオブジェクトを生成し、HttpsURLConnectionにて接続 ○プロキシ経由でない場合: System.getProperties().remove("https.proxySet"); System.getProperties().remove("https.proxyHost"); System.getProperties().remove("https.proxyPort"); としたあと URLオブジェクトを生成し、HttpsURLConnectionにて接続 上記のように行っているのですが、 一度プロキシ経由の接続を行うと、その後どうやっても プロキシ経由での接続になってしまいます。 ちなみにHttpURLConnectionを使用した場合は、上記のように 行ってうまく切り替えができています。 以上、よろしくお願いします。 | ||||||||||||
|
投稿日時: 2004-11-24 12:25
HttpsURLConnection の実装にも依存すると思いますが初回しか認識されないのかもしれません。
システムプロパティは JVM 上でグローバルに認識されますから動的に変更されるとスレッドセーフでなくなってしまいますね。うまくいく、いかないに関わらずそのようなコーディングはオススメいたしません。 | ||||||||||||
|
投稿日時: 2004-11-24 13:19
インギさんありがとうございます。
そういう感じがしているのですが、HttpURLConnectionだとうまくいくので、 何とかならないかなと。
HttpsURLConnectionを使用するメソッドにsynchronizedをつければ、 スレッドセーフにならないですか。 ただ、私もよくないやり方だとは思ってます。 別の方法で実現できればいいとおもうのですが、何かよい方法は ありませんでしょうか。 | ||||||||||||
|
投稿日時: 2004-11-24 13:59
HttpsURLConnection を利用する箇所が一つならば同期をかけることで一応スレッドセーフになりますね。
>別の方法で実現できればいいとおもうのですが、何かよい方法は >ありませんでしょうか。 プロキシを使う箇所と使わない箇所、別のJVMで実行してはいかがでしょうか。 | ||||||||||||
|
投稿日時: 2004-11-24 15:37
無理やりですが、ClassLoaderを別にして、Systemプロパティの変更前後
にHttpsURLConnectionクラスをそれぞれのClassLoaderからロードし、使い 分けるとか…実装が少し面倒そうですが。 [ メッセージ編集済み 編集者: シュン 編集日時 2004-11-24 15:38 ] | ||||||||||||
|
投稿日時: 2004-11-24 18:12
インギさんありがとうございます。
別のJVMで実行するというのは、実行環境にもうひとつJVMを立ち上げるということですか。 そうでしたら、ちょっと環境的に厳しいです。 [ メッセージ編集済み 編集者: ゆうちゃん 編集日時 2004-11-24 18:14 ] | ||||||||||||
|
投稿日時: 2004-11-24 18:14
シュンさん、ありがとうございます。
ClassLoaderを別にする具体的なサンプルとかありますでしょうか。 ございましたら、教えていただきたいです。 | ||||||||||||
|
投稿日時: 2004-11-24 20:27
全部書くのは大変なので、ClassLoaderを分けることであるクラスの
staticイニシャライザを2回呼び出して、それぞれの初期化結果を利用して インスタンスを生成する方法だけ、サンプル書きますね。 1.このコードをコンパイルし、出来たクラスファイルを適当な場所に置いてください。
2.下記のソースをコンパイルし、実行してみてください。
注意:DynamicClass.classの存在するディレクトリにはCLASSPATHを 通さないでください。通してしまうと、SystemClassLoaderがDynamic Classをロードしてしまうので、思い通り動きません。 コンソールに以下の出力がされます。
obj1とobj2は両方ともDynamicClassのインスタンスですが、それぞれの インスタンスの作成元となるクラスのstaticフィールドの値は違うことが 確認できます。 [ メッセージ編集済み 編集者: シュン 編集日時 2004-11-24 20:32 ] |