我有一个桌面客户端,它将数据发送到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没有被客户的网络过滤器阻止,因为我们在网络浏览器中测试了地址。
以下是验证用户输入的注册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.proxyHost
和http.proxyPort
的系统属性。我知道属性已正确设置,但我仍然收到此身份验证错误。查看从我的程序生成的日志向我展示了这个:
checkRegistration INFO: Server response status code to checkRegistration: 407
如何解决此身份验证错误?
答案 0 :(得分: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
根据您的代理服务器,您可能需要查看NTCredentials而不是UserPasswordCredentials。
我还建议您考虑使用wireshark捕获网络数据包并检查代理服务器的响应,以确保导致问题的原因。
答案 1 :(得分:1)
为了完整起见,由于发现此问题正在搜索JVM http.proxy属性,如果使用JVM基础结构代理用户名和密码可以使用以下方式提供:
System.setProperty("http.proxyUser",proxyUserName)
System.setProperty("http.proxyPassword",proxyUsePassword).
答案 2 :(得分:0)
出于某种原因,在客户端设置参数对我来说不起作用。
但是在http方法上工作。