要传递给 Java 应用程序以使用 http 代理进行身份验证的 Java 属性
What Java properties to pass to a Java app to authenticate with a http proxy
我有一个 Java 应用程序正在尝试通过 http 代理访问 Web 服务。 Java 应用是第 3 方应用,我们无法访问其源代码。
它的启动可以通过传递 Java 启动参数等来配置。
我想知道可以传递哪些 java 属性,以便应用程序可以使用登录用户的 NTLM 凭据来验证代理连接?
当我将 https.proxyHost 和 https.proxyPort(即 -Dhttps.proxyHost=abcd ... 传递给 jvm 命令行)时,我确实在日志中看到了差异。现在失败并显示以下消息。
[WrapperSimpleAppMain] [AuthChallengeProcessor] ntlm authentication scheme selected
INFO | jvm 5 | 2015/06/03 14:49:25 | 2015-06-03 14:49:25,380
INFO [WrapperSimpleAppMain] [HttpMethodDirector] No credentials available for NTLM <any realm>@proxy.ins.dell.com:80
INFO | jvm 5 | 2015/06/03 14:49:25 | Exiting due to fatal exception.
INFO | jvm 5 | 2015/06/03 14:49:25 | com.atlassian.bamboo.agent.bootstrap.RemoteAgentHttpException: HTTP status code 407 received in response to fingerprint request
我尝试通过 http.proxyUser 和 http.proxyPassword。那没有用。
我想知道什么是使 Java 应用透明地使用代理信息而无需更改代码的正确配置。
谢谢
还需要为 NTLM 身份验证指定 NT 域。
-Dhttp.proxyUser=MyDomain/username
或通过设置
-Dhttp.auth.ntlm.domain=MyDomain
并且您还必须明确指示 HttpClient 考虑系统属性,默认情况下它不会这样做
CloseableHttpClient client = HttpClients.createSystem();
或
CloseableHttpClient client = HttpClients.custom()
.useSystemProperties()
.build();
最后我通过反复试验弄明白了。将 java.net.useSystemProxies=true 与 https.proxyPort、https.proxyHost 一起传递解决了这个问题。
基本上 java vm 命令行
-Djava.net.useSystemProxies=true -Dhttps.proxyPort=80 -Dhttps.proxyHost=proxyserver.mycompany.com
我没有通过 https.proxyUser、https.proxyPassword。我相信代理身份验证使用与我的登录 NTLM 凭据相同的凭据。
Apache HttpClient 4.5 的工作示例。*
注意:除非您使用 HttpClients.custom().useSystemProperties().build();
,否则它不起作用
System.setProperty("http.proxyHost" , "myhost");
System.setProperty("http.proxyPort" , "myport");
System.setProperty("http.proxyUser" , "myuser");
System.setProperty("http.proxyPassword" , "mypassword");
CloseableHttpClient httpclient = HttpClients.custom().useSystemProperties().build();
try {
HttpGet httpGet = new HttpGet("http://www.google.com");
CloseableHttpResponse httpResponse = httpclient.execute(httpGet);
try {
System.out.println(httpResponse.getStatusLine());
for (Header header : response.getAllHeaders()) {
System.out.println("header " + header.getName() + " - " + header.getValue());
}
String responseString = EntityUtils.toString(httpResponse.getEntity());
System.out.println("responseString :" + responseString);
} finally {
response.close();
}
} catch (Exception exception) {
exception.printStackTrace();
} finally {
httpclient.close();
}
您可以使用
设置属性,而不是使用 System.setProperty
-Dhttp.proxyHost="myhost" -Dhttp.proxyPort="myport" -Dhttp.proxyUser=myuser -Dhttp.proxyPassword="mypassword"
重要:如果您尝试访问 HTTPS 服务,您必须将属性更改为 https
如果您使用 https.* 属性并访问 http URL
,它也不起作用
System.setProperty("https.proxyHost" , "myhost");
System.setProperty("https.proxyPort" , "myport");
System.setProperty("https.proxyUser" , "myuser");
System.setProperty("https.proxyPassword" , "mypassword");
CloseableHttpClient httpclient = HttpClients.custom().useSystemProperties().build();
try {
HttpGet httpGet = new HttpGet("https://www.google.com");
API: https://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/
纯 Java - 没有 Apache HttpClient
如果您使用 java.net.HttpURLConnection class
,您可以设置相同的 https.proxyHost 等属性
始终尊重对 https://... 连接使用 https.proxyHost 等,对 http://... 连接使用 http.proxyHost 等!
String uri = "https://www.google.com/";
HttpURLConnection connection = (HttpURLConnection) new URL(uri).openConnection();
InputStream response = connection.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String inputLine; int x = 0;
while ((inputLine = in.readLine()) != null) {
System.out.println(inputLine);
x++; if (x > 4) { break;}
}
in.close();
response.close();
我有一个 Java 应用程序正在尝试通过 http 代理访问 Web 服务。 Java 应用是第 3 方应用,我们无法访问其源代码。
它的启动可以通过传递 Java 启动参数等来配置。 我想知道可以传递哪些 java 属性,以便应用程序可以使用登录用户的 NTLM 凭据来验证代理连接?
当我将 https.proxyHost 和 https.proxyPort(即 -Dhttps.proxyHost=abcd ... 传递给 jvm 命令行)时,我确实在日志中看到了差异。现在失败并显示以下消息。
[WrapperSimpleAppMain] [AuthChallengeProcessor] ntlm authentication scheme selected
INFO | jvm 5 | 2015/06/03 14:49:25 | 2015-06-03 14:49:25,380
INFO [WrapperSimpleAppMain] [HttpMethodDirector] No credentials available for NTLM <any realm>@proxy.ins.dell.com:80
INFO | jvm 5 | 2015/06/03 14:49:25 | Exiting due to fatal exception.
INFO | jvm 5 | 2015/06/03 14:49:25 | com.atlassian.bamboo.agent.bootstrap.RemoteAgentHttpException: HTTP status code 407 received in response to fingerprint request
我尝试通过 http.proxyUser 和 http.proxyPassword。那没有用。 我想知道什么是使 Java 应用透明地使用代理信息而无需更改代码的正确配置。
谢谢
还需要为 NTLM 身份验证指定 NT 域。
-Dhttp.proxyUser=MyDomain/username
或通过设置
-Dhttp.auth.ntlm.domain=MyDomain
并且您还必须明确指示 HttpClient 考虑系统属性,默认情况下它不会这样做
CloseableHttpClient client = HttpClients.createSystem();
或
CloseableHttpClient client = HttpClients.custom()
.useSystemProperties()
.build();
最后我通过反复试验弄明白了。将 java.net.useSystemProxies=true 与 https.proxyPort、https.proxyHost 一起传递解决了这个问题。
基本上 java vm 命令行
-Djava.net.useSystemProxies=true -Dhttps.proxyPort=80 -Dhttps.proxyHost=proxyserver.mycompany.com
我没有通过 https.proxyUser、https.proxyPassword。我相信代理身份验证使用与我的登录 NTLM 凭据相同的凭据。
Apache HttpClient 4.5 的工作示例。*
注意:除非您使用 HttpClients.custom().useSystemProperties().build();
System.setProperty("http.proxyHost" , "myhost");
System.setProperty("http.proxyPort" , "myport");
System.setProperty("http.proxyUser" , "myuser");
System.setProperty("http.proxyPassword" , "mypassword");
CloseableHttpClient httpclient = HttpClients.custom().useSystemProperties().build();
try {
HttpGet httpGet = new HttpGet("http://www.google.com");
CloseableHttpResponse httpResponse = httpclient.execute(httpGet);
try {
System.out.println(httpResponse.getStatusLine());
for (Header header : response.getAllHeaders()) {
System.out.println("header " + header.getName() + " - " + header.getValue());
}
String responseString = EntityUtils.toString(httpResponse.getEntity());
System.out.println("responseString :" + responseString);
} finally {
response.close();
}
} catch (Exception exception) {
exception.printStackTrace();
} finally {
httpclient.close();
}
您可以使用
设置属性,而不是使用 System.setProperty-Dhttp.proxyHost="myhost" -Dhttp.proxyPort="myport" -Dhttp.proxyUser=myuser -Dhttp.proxyPassword="mypassword"
重要:如果您尝试访问 HTTPS 服务,您必须将属性更改为 https 如果您使用 https.* 属性并访问 http URL
,它也不起作用System.setProperty("https.proxyHost" , "myhost");
System.setProperty("https.proxyPort" , "myport");
System.setProperty("https.proxyUser" , "myuser");
System.setProperty("https.proxyPassword" , "mypassword");
CloseableHttpClient httpclient = HttpClients.custom().useSystemProperties().build();
try {
HttpGet httpGet = new HttpGet("https://www.google.com");
API: https://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/
纯 Java - 没有 Apache HttpClient
如果您使用 java.net.HttpURLConnection class
,您可以设置相同的 https.proxyHost 等属性始终尊重对 https://... 连接使用 https.proxyHost 等,对 http://... 连接使用 http.proxyHost 等!
String uri = "https://www.google.com/";
HttpURLConnection connection = (HttpURLConnection) new URL(uri).openConnection();
InputStream response = connection.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String inputLine; int x = 0;
while ((inputLine = in.readLine()) != null) {
System.out.println(inputLine);
x++; if (x > 4) { break;}
}
in.close();
response.close();