如何配置用户名和密码以使用Java验证http代理服务器?
我刚刚找到以下配置参数:
http.proxyHost=http.proxyPort= https.proxyHost= https.proxyPort=
但是,我的代理服务器需要身份验证 如何配置我的应用程序以使用代理服务器?
(编辑:正如OP指出的那样,使用a java.net.Authenticator
也是必需的.为了正确起见,我正在更新我的答案.)
对于身份验证,用于java.net.Authenticator
设置代理的配置并设置系统属性http.proxyUser
和http.proxyPassword
.
final String authUser = "user"; final String authPassword = "password"; Authenticator.setDefault( new Authenticator() { @Override public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication( authUser, authPassword.toCharArray()); } } ); System.setProperty("http.proxyUser", authUser); System.setProperty("http.proxyPassword", authPassword);
你几乎就在那里,你只需追加:
-Dhttp.proxyUser=someUserName -Dhttp.proxyPassword=somePassword
http://rolandtapken.de/blog/2012-04/java-process-httpproxyuser-and-httpproxypassword说:
其他建议使用自定义默认身份验证器.但这很危险,因为这会将密码发送给任何要求的人.
如果某些http/https请求没有通过代理(这很可能取决于配置),这是相关的.在这种情况下,您可以将凭据直接发送到某个http服务器,而不是代理服务器.
他建议以下修复.
// Java ignores http.proxyUser. Here come's the workaround. Authenticator.setDefault(new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { if (getRequestorType() == RequestorType.PROXY) { String prot = getRequestingProtocol().toLowerCase(); String host = System.getProperty(prot + ".proxyHost", ""); String port = System.getProperty(prot + ".proxyPort", "80"); String user = System.getProperty(prot + ".proxyUser", ""); String password = System.getProperty(prot + ".proxyPassword", ""); if (getRequestingHost().equalsIgnoreCase(host)) { if (Integer.parseInt(port) == getRequestingPort()) { // Seems to be OK. return new PasswordAuthentication(user, password.toCharArray()); } } } return null; } });
我还没试过,但它看起来不错.
我稍微修改了原始版本以使用equalsIgnoreCase()而不是equals(host.toLowerCase())因为:http://mattryall.net/blog/2009/02/the-infamous-turkish-locale-bug 和我添加"80"作为端口的默认值,以避免Integer.parseInt(port)中的NumberFormatException.
大多数答案都在那里,但对我来说并不完全.这对我来说对java.net.HttpURLConnection有用(我用JDK 7和JDK 8测试了所有的情况).请注意,您不必使用Authenticator类.
案例1:没有用户身份验证的代理,访问HTTP资源
-Dhttp.proxyHost=myproxy -Dhttp.proxyPort=myport
案例2:使用用户身份验证的代理,访问HTTP资源
-Dhttp.proxyHost=myproxy -Dhttp.proxyPort=myport -Dhttps.proxyUser=myuser -Dhttps.proxyPassword=mypass
案例3:没有用户身份验证的代理,访问HTTPS资源(SSL)
-Dhttps.proxyHost=myproxy -Dhttps.proxyPort=myport
案例4:使用用户身份验证的代理,访问HTTPS资源(SSL)
-Dhttps.proxyHost=myproxy -Dhttps.proxyPort=myport -Dhttps.proxyUser=myuser -Dhttps.proxyPassword=mypass
案例5:没有用户身份验证的代理,访问HTTP和HTTPS资源(SSL)
-Dhttp.proxyHost=myproxy -Dhttp.proxyPort=myport -Dhttps.proxyHost=myproxy -Dhttps.proxyPort=myport
案例6:使用用户身份验证的代理,访问HTTP和HTTPS资源(SSL)
-Dhttp.proxyHost=myproxy -Dhttp.proxyPort=myport -Dhttp.proxyUser=myuser -Dhttp.proxyPassword=mypass -Dhttps.proxyHost=myproxy -Dhttps.proxyPort=myport -Dhttps.proxyUser=myuser -Dhttps.proxyPassword=mypass
您也可以使用System.setProperty("key","value")设置属性.
要访问HTTPS资源,您可能必须通过下载服务器证书并将其保存在信任库中然后使用该信任库来信任该资源.即
System.setProperty("javax.net.ssl.trustStore", "c:/temp/cert-factory/my-cacerts"); System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
但是,仅设置该参数,身份验证不起作用.
有必要添加以下代码:
final String authUser = "myuser"; final String authPassword = "secret"; System.setProperty("http.proxyHost", "hostAddress"); System.setProperty("http.proxyPort", "portNumber"); System.setProperty("http.proxyUser", authUser); System.setProperty("http.proxyPassword", authPassword); Authenticator.setDefault( new Authenticator() { public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(authUser, authPassword.toCharArray()); } } );
对于Java 1.8及更高版本,您必须设置
-Djdk.http.auth.tunneling.disabledSchemes =
使用基本授权代理使用https和Authenticator,如接受的答案中所述