5

Webサーバーにデータを送信するデスクトップクライアントがあり、プロキシサーバーを経由できないようです。

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

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

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

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

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

/**
 * Loads a collection of exams from the web site. The URL is determined by
 * configuration or registration since it is State specific.
 */
public static int importExamsWS(StringBuilder msg) {
    try {
        java.net.URL onlineExams = new URL(examURL);
        //Parse the XML data from InputStream and store it.
        return importExams(onlineExams.openStream(), msg);

    } 
    catch (java.net.UnknownHostException noDNS) {
        showError(noDNS, "Unable to connect to proctinator.com to download the exam file.\n"
                + "There is probably a problem with your Internet proxy settings.");
    }
    catch (MalformedURLException | IOException duh) {
        showFileError(duh);
    }
    return 0;
}

ただし、データをWebサーバーに送信しようとすると、プロキシ設定が無視され、IOExceptionがスローされたように見えます。すなわち:

org.apache.http.conn.HttpHostConnectException: Connection to http://proctinator.com:8080 refused

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;
    }
}

問題がプロキシサーバーの構成に起因していることはほぼ間違いありませんが、SystemDefaultHttpClientのドキュメントでhttp.proxyHostは、とのシステムプロパティを使用していると主張しています http.proxyPort。プロパティが適切に設定されていることはわかっていますが、それでもこの認証エラーが発生します。プログラムから生成されたログを表示すると、次のことがわかりました。

checkRegistration INFO: Server response status code to checkRegistration: 407 

この認証エラーを解決するにはどうすればよいですか?

4

3 に答える 3

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 認証プロキシ サーバー バージョンで動作します - プロキシが NTLM 認証の v1 または v2 を使用しているかどうかを確認してください)。参照と回避策については、次を確認してください。

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

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

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

プロキシ サーバーによっては、UserPasswordCredentials ではなく NTCredentials を調べる必要がある場合があります。

また、wireshark を使用してネットワーク パケットをキャプチャし、プロキシ サーバーからの応答を確認して、問題の原因を完全に確認することをお勧めします。

于 2012-07-08T23:08:02.277 に答える
1

完全を期すために、この質問は JVM http.proxy プロパティの検索で見つかるため、JVM インフラストラクチャ プロキシのユーザー名とパスワードを使用する場合は、次を使用して指定できます。

System.setProperty("http.proxyUser",proxyUserName)
System.setProperty("http.proxyPassword",proxyUsePassword).
于 2012-07-11T17:08:59.213 に答える