- PR -

HttpsURLConnectionを使用したプロキシ経由の接続について

投稿者投稿内容
ゆうちゃん
会議室デビュー日: 2004/11/24
投稿数: 10
投稿日時: 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を使用した場合は、上記のように
行ってうまく切り替えができています。

以上、よろしくお願いします。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-11-24 12:25
HttpsURLConnection の実装にも依存すると思いますが初回しか認識されないのかもしれません。

システムプロパティは JVM 上でグローバルに認識されますから動的に変更されるとスレッドセーフでなくなってしまいますね。うまくいく、いかないに関わらずそのようなコーディングはオススメいたしません。
ゆうちゃん
会議室デビュー日: 2004/11/24
投稿数: 10
投稿日時: 2004-11-24 13:19
インギさんありがとうございます。

引用:

HttpsURLConnection の実装にも依存すると思いますが初回しか認識されないのかもしれません。


そういう感じがしているのですが、HttpURLConnectionだとうまくいくので、
何とかならないかなと。

引用:

システムプロパティは JVM 上でグローバルに認識されますから動的に変更されるとスレッドセーフでなくなってしまいますね。うまくいく、いかないに関わらずそのようなコーディングはオススメいたしません。


HttpsURLConnectionを使用するメソッドにsynchronizedをつければ、
スレッドセーフにならないですか。
ただ、私もよくないやり方だとは思ってます。
別の方法で実現できればいいとおもうのですが、何かよい方法は
ありませんでしょうか。

山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-11-24 13:59
HttpsURLConnection を利用する箇所が一つならば同期をかけることで一応スレッドセーフになりますね。

>別の方法で実現できればいいとおもうのですが、何かよい方法は
>ありませんでしょうか。
プロキシを使う箇所と使わない箇所、別のJVMで実行してはいかがでしょうか。
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2004-11-24 15:37
無理やりですが、ClassLoaderを別にして、Systemプロパティの変更前後
にHttpsURLConnectionクラスをそれぞれのClassLoaderからロードし、使い
分けるとか…実装が少し面倒そうですが。

[ メッセージ編集済み 編集者: シュン 編集日時 2004-11-24 15:38 ]
ゆうちゃん
会議室デビュー日: 2004/11/24
投稿数: 10
投稿日時: 2004-11-24 18:12
インギさんありがとうございます。

引用:

プロキシを使う箇所と使わない箇所、別のJVMで実行してはいかがでしょうか。


別のJVMで実行するというのは、実行環境にもうひとつJVMを立ち上げるということですか。
そうでしたら、ちょっと環境的に厳しいです。

[ メッセージ編集済み 編集者: ゆうちゃん 編集日時 2004-11-24 18:14 ]
ゆうちゃん
会議室デビュー日: 2004/11/24
投稿数: 10
投稿日時: 2004-11-24 18:14
シュンさん、ありがとうございます。
引用:

無理やりですが、ClassLoaderを別にして、Systemプロパティの変更前後
にHttpsURLConnectionクラスをそれぞれのClassLoaderからロードし、使い
分けるとか…実装が少し面倒そうですが。


ClassLoaderを別にする具体的なサンプルとかありますでしょうか。
ございましたら、教えていただきたいです。
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2004-11-24 20:27
全部書くのは大変なので、ClassLoaderを分けることであるクラスの
staticイニシャライザを2回呼び出して、それぞれの初期化結果を利用して
インスタンスを生成する方法だけ、サンプル書きますね。

1.このコードをコンパイルし、出来たクラスファイルを適当な場所に置いてください。
コード:

public class DynamicClass {
static String property;
static{
property = System.getProperty("testprop");
}
public DynamicClass(){
System.out.println(property);
}
}



2.下記のソースをコンパイルし、実行してみてください。
コード:

import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;

public class ClassLoadTest {
public static void main(String[] args) throws Exception{
URL url = new File("DynamicClass.classが存在するパス").toURL();

System.setProperty("testprop","foo");
ClassLoader loader1 = new URLClassLoader(new URL[]{url},
ClassLoader.getSystemClassLoader());
System.out.println("Loading with testprop = foo");
Class cls1 = loader1.loadClass("DynamicClass");
Object obj1 = cls1.newInstance();

System.setProperty("testprop","bar");
ClassLoader loader2 = new URLClassLoader(new URL[]{url},
ClassLoader.getSystemClassLoader());
System.out.println("Loading with testprop = bar");
Class cls2 = loader2.loadClass("DynamicClass");
Object obj2 = cls2.newInstance();
}
}


注意:DynamicClass.classの存在するディレクトリにはCLASSPATHを
通さないでください。通してしまうと、SystemClassLoaderがDynamic
Classをロードしてしまうので、思い通り動きません。


コンソールに以下の出力がされます。
コード:

Loading with testprop = foo
foo
Loading with testprop = bar
bar



obj1とobj2は両方ともDynamicClassのインスタンスですが、それぞれの
インスタンスの作成元となるクラスのstaticフィールドの値は違うことが
確認できます。

[ メッセージ編集済み 編集者: シュン 編集日時 2004-11-24 20:32 ]

スキルアップ/キャリアアップ(JOB@IT)