Java的通信通过Web代理使用Apache的HttpClient失败(Java communica

2019-06-25 21:32发布

我将数据发送到Web服务器的桌面客户端,我似乎无法通过代理服务器来获得。

更新 :试图通过代理服务器进行通信时,我得到一个407 HTTP错误。

当从我的网络服务器下载信息,一切都很好。 一旦用户配置代理服务器(使用对话框我写)下载工作正常。 但是,使用上传数据org.apache.http.client.HttpClient不工作。

我收集来自一个JDialog的信息后,配置与这样的代码的代理服务器。

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

现在,一旦我们这样做,简单的下载做工精细。 举例来说,我有一些代码从我的Web服务器读取一些XML数据(见下文)。 对客户的网络被显示在我的catch块的错误已配置的代理服务器设置之前再一次正确的代理设置都工作得很好。

/**
 * 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

现在我知道,8080端口是不会被客户的Web过滤器,因为我们在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.proxyHosthttp.proxyPort 。 我知道属性已正确设置,但我仍然得到这个认证错误。 查看从我的程序生成的日志给我这样的:

checkRegistration INFO: Server response status code to checkRegistration: 407 

如何解决此验证错误?

Answer 1:

我会采取了一枪。 如果代理服务器使用基本身份验证,可以使用下面的代码片段为例:

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或NTLM身份验证的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

根据您的代理服务器上,你可能需要考虑NTCredentials代替UserPasswordCredentials。

我也建议你不妨考虑使用Wireshark来捕获网络数据包,并检查从代理服务器的响应,以绝对确保是什么原因造成的问题。



Answer 2:

只是为了完整性,因为这个问题是找到搜索JVM http.proxy性能,如果使用JVM基础设施代理用户名和密码,可以使用提供:

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


Answer 3:

出于某种原因,在客户端设置参数并没有为我工作。

但在HTTP方法奏效。



文章来源: Java communication fails through web proxy using Apache HttpClient