2012-06-28 35 views
5

Webサーバーにデータを送信するデスクトップクライアントがあり、プロキシサーバーを経由できないようです。Apache HttpClientを使用してWebプロキシ経由でJava通信に失敗する

更新:プロキシを介して通信しようとすると、407 HTTPエラーが発生します。

私のWebサーバーから情報をダウンロードするときは、すべて問題ありません。ユーザーがプロキシサーバーを設定すると(私が書いたダイアログボックスを使用して)、ダウンロードは正常に動作します。しかし、org.apache.http.client.HttpClientを使用してデータをアップロードすることはできません。

JDialogから情報を収集した後、このようなコードでプロキシサーバーを構成しています。

 System.setProperty("http.proxyHost", proxyHost); 
     System.setProperty("http.proxyPort", "" + portNumber); 

これで、簡単なダウンロードがうまくいきました。たとえば、WebサーバーからXMLデータを読み取るコードがあります(下記参照)。顧客のネットワークでは、プロキシ設定が構成される前にキャッチブロックのエラーが表示され、正しいプロキシが設定されるとすべて正常に機能しました。

しかし、Webサーバーにデータを送信しようとすると、プロキシ設定が無視されてIOExceptionがスローされるようになります。つまり、Webブラウザでアドレスをテストしたため、ポート8080が顧客のWebフィルタによってブロックされていないことが分かりました。

ユーザーが入力した登録IDを確認するコードは次のとおりです。 更新:このメソッドではプロキシも設定しています。

//Registered is just an enum with ACTIVE, INACTIVE, NOTFOUND, ERROR 
public static Registered checkRegistration(int id) throws IOException {  
    httpclient = new DefaultHttpClient(); 
    Config pref = Config.getConfig(); //stores user-entered proxy settings. 
    HttpHost proxy = new HttpHost(pref.getProxyServer(), pref.getProxyPort()); 
    httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy); 
    URIBuilder builder = new URIBuilder(); 
    String path = "/Proctorest/rsc/register/" + id; 
    try { 
     builder.setScheme("http").setHost(server).setPort(8080).setPath(path); 
     URI uri = builder.build(); 
     System.out.println("Connecting to " + uri.toString()); 
     HttpGet httpget = new HttpGet(uri); 
     HttpResponse response = httpclient.execute(httpget); 
     System.out.println(response.getStatusLine().toString()); 
     if(response.getStatusLine().getStatusCode()==200) { 
      String msg = EntityUtils.toString(response.getEntity()); 
      GUI.globalLog.log(Level.INFO, "Server response to checkRegistration(" + id + "): " + msg); 
      return Registered.stringToRegistered(msg); 
     } 
     else { 
      GUI.globalLog.log(Level.INFO, "Server response status code to checkRegistration: " + 
        response.getStatusLine().getStatusCode()); 
      return Registered.ERROR; 
     } 
    } 
    catch(java.net.URISyntaxException bad) { 
     System.out.println("URI construction error: " + bad.toString()); 
     return Registered.ERROR; 
    } 
} 

私はこの問題は、プロキシサーバーの設定から来ていることはほぼ正だ、まだそれがかかることdocs for SystemDefaultHttpClient主張はhttp.proxyHosthttp.proxyPortのシステムプロパティを使用しています。私はプロパティが正しく設定されていることを知っているが、私はまだこの認証エラーを取得しています。私のプログラムから生成されたログを見ると、私には次のようなメッセージが表示されました:

checkRegistration INFO: Server response status code to checkRegistration: 407 

どうすればこの認証エラーを解決できますか?

+0

どのようにデータを送信しますか?ポスト? PUT?パラメータを持つGET?申し訳ありませんが、私はあなたの質問から見つけることができません。 –

+0

ここではGETを使用しています。図示されていない他の方法はPOSTを使用する。 上記のコードでは、HttpGet httpget = new HttpGet(uri); – Thorn

+0

dev環境でプロキシを設定して、devマシンでファイアウォールを使用して、プロキシ以外のすべての発信HTTPをブロックできますか? – artbristol

答えて

5

私はショットを撮ります。プロキシサーバーが基本認証を使用している場合は、一例として、次のコードを使用することができます。

DefaultHttpClient httpclient = new DefaultHttpClient(); 
httpclient.getCredentialsProvider().setCredentials(
    new AuthScope("PROXY HOST", 8080), 
    new UsernamePasswordCredentials("username", "password")); 

HttpHost targetHost = new HttpHost("TARGET HOST", 443, "https"); 
HttpHost proxy = new HttpHost("PROXY HOST", 8080); 

httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy); 

プロキシサーバーがNTLM認証を使用している場合、私は(NTLMサポートは、すべてのプロキシサーバのバージョンで利用可能ですそれを信じていません一部のNTLM認証プロキシサーバーのバージョンで動作します - プロキシがv1またはv2のNTLM認証を使用しているかどうかを確認してください)。参照&の回避策については、次のチェックすることができます。

http://devsac.blogspot.com/2010/10/supoprt-for-ntlmv2-with-apache.html

http://hc.apache.org/httpcomponents-client-ga/ntlm.html

http://htmlunit.sourceforge.net/ntlm.html

は、プロキシサーバーによっては、あなたの代わりにUserPasswordCredentialsのNTCredentialsを検討する必要があるかもしれません。

wiresharkを使用してネットワークパケットをキャプチャし、プロキシサーバーからの応答を確認して、何が問題を引き起こしているかを確かめることをお勧めします。

+0

そうかもしれません。 – Thorn

+0

確認のため、wiresharkを使用してネットワークパケットを取得することをお勧めします。それには時間がかかりすぎる場合は、プロキシサーバーがどれかを確認できます(企業環境の場合は、IE設定でプロキシサーバーを使用している可能性が高く、IE設定でスクリプトをポイントするか、トラフィックをルーティングするデスクトップ)。 –

+0

良い提案ですが、wiresharkは恐らく過殺です。このネットワークのITマネージャーとのプロキシ設定を確認しました。しかし、彼は認証が必要であると私に言わなかった。ノートパソコンでオンラインにしようとすると、プロキシサーバーのユーザー名とパスワードを尋ねられました。しかし、協力ネットワークにログインしているユーザーは決してこれを求められません。しかし、私のソフトウェアはそれを促す必要があるようです。 – Thorn

1

この質問はJVM http.proxyプロパティを探して発見されたので、ただ、完全を期すため、JVMのインフラプロキシのユーザー名とパスワードを使用している場合は使用して提供することができます。

System.setProperty("http.proxyUser",proxyUserName) 
System.setProperty("http.proxyPassword",proxyUsePassword). 
0

を何らかの理由で、クライアントのdidnのパラメータを設定します私のために働く。

しかし、httpメソッドで動作しました。

関連する問題