无法通过代理隧道连接。代理返回"HTTP/1.1 407 Proxy Authorization Required"。

3

我正在尝试访问Google API的https URL。使用下面的代码,但出现了一些错误。但是我可以访问一个Google API的http URL,而且没有出现任何错误。

DataInputStream di = null;

FileOutputStream fo = null;

byte[] b = new byte[1];

// PROXY
System.setProperty("https.proxyHost", "my proxy");
System.setProperty("https.proxyPort", "8080");


Authenticator.setDefault(new PasswordAuthenticator());


URL u = new URL("https://maps.googleapis.com/maps/api/place/autocomplete/json?input=Vict&types=geocode&language=fr&sensor=true&key=keyforuse");

HttpURLConnection con = (HttpURLConnection) u.openConnection();

sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder();
String encodedUserPwd = encoder.encode("domain\\user:password"
        .getBytes());
con.setRequestProperty("Proxy-Authorization", "Basic "
        + encodedUserPwd);

di = new DataInputStream(con.getInputStream());
// result = parseJSON(di);
while (-1 != di.read(b, 0, 1)) {
    System.out.print(new String(b));
}

但是出现以下错误:
java.io.IOException: Unable to tunnel through proxy. Proxy returns "HTTP/1.1 407 Proxy Authorization Required"
    at sun.net.www.protocol.http.HttpURLConnection.doTunneling(HttpURLConnection.java:1648)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:164)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1172)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:234)
    at kf.store.locator.googlemaps.test.main(test.java:58)

需要帮忙吗?

2个回答

0

您可能不需要在用户名前面加上域名。我曾经遇到过非常类似的问题,当我删除用户名前面的域名时,问题得到了解决。由于代理服务器在一个域中,我认为这意味着您也在同一个域下。


我已经删除了域名并使用以下代码: sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder(); String encodedUserPwd = encoder.encode("386654:Jun1@2013".getBytes()); con.setRequestProperty("Proxy-Authorization", "Basic " + encodedUserPwd); 但仍然出现错误:无法通过代理进行隧道连接。代理返回“HTTP/1.1 400 Bad Request”。如有帮助,将不胜感激。 - rand
你尝试过将编码凭据添加到代理主机而不是添加编码凭据吗?System.setProperty("https.proxyHost", "user:pass@proxyHost")我不确定这是否有帮助,但值得一试。我以前就用过这种方法。除此之外,你的代码看起来很好。 - Callan

-1

我通过使用我的用户名和密码向代理服务器进行身份验证来解决了这个问题。如果您在公司的网络上,它也可以是您的SSO凭据。

等价于:
-Dhttp.proxyUser=myusername 
-Dhttp.proxyPassword=mypassword
-Dhttp.proxyHost=myproxyserver.com
-Dhttp.proxyPort=9000

这仅适用于Apache HTTP客户端。JDK忽略http.proxyUser/password - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接