HttpUrlConnection代理身份验证进入重定向循环

时间:2015-05-05 21:07:52

标签: java authentication proxy httpurlconnection basic-authentication

我正在尝试通过经过身份验证的代理获取URL的内容。这是我试图使用的代码:

        Authenticator authenticator = new Authenticator() {
            public PasswordAuthentication getPasswordAuthentication() {
                System.out.println("authenticating");
                return (new PasswordAuthentication("username", "password".toCharArray()));
            }
        };
        Authenticator.setDefault(authenticator);
        URL url = new URL("http://www.google.com");
        InetSocketAddress proxyAddress = new InetSocketAddress("address.of.proxy", 6060);
        Proxy proxy = new Proxy(Proxy.Type.HTTP, proxyAddress);
        HttpURLConnection uc = (HttpURLConnection) url.openConnection(proxy);
        uc.connect();
        System.out.println(uc.getResponseCode());

由于某种原因,身份验证进入重定向循环,因此结果是身份验证器打印“身份验证”20次,然后是ProtocolException

java.net.ProtocolException: Server redirected too many  times (20)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1846)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1439)
at java.net.URLConnection.getContent(URLConnection.java:739)
at proxytest.RunThis.main(RunThis.java:29)

代理正在使用给定的凭据,我已通过浏览器尝试过。 我试图让这个工作好几天,我已经尝试设置系统属性,apache httpclient,以及任何我可以摆脱谷歌。 任何想法都赞赏。 :)

更新

我使用WireShark进行了测试,代理身份验证详细信息在请求中,但代理会抛出407错误。再次,凭证是可以的,它完全从浏览器工作(我实际上从源代码复制它们以确保)。

但有一点我注意到了。 Proxy-Authorization标头的值在浏览器和java发送的请求之间只有一个字符不同。这可能意味着什么?

2 个答案:

答案 0 :(得分:2)

Authenticator.setDefault(authenticator); 必须在 openConnection(proxy) 之后;

URL url = new URL("http://www.google.com");
InetSocketAddress proxyAddress = new InetSocketAddress("address.of.proxy", 6060);
Proxy proxy = new Proxy(Proxy.Type.HTTP, proxyAddress);
HttpURLConnection uc = (HttpURLConnection) url.openConnection(proxy);
    Authenticator.setDefault(new Authenticator() {
          protected PasswordAuthentication getPasswordAuthentication() {
            return (new PasswordAuthentication("username", "password".toCharArray()));
          }
        });
uc.connect();
System.out.println(uc.getResponseCode());

答案 1 :(得分:0)

只需设置JVM属性:

jdk.http.auth.tunneling.disabledSchemes = ""

请参阅:http://www.oracle.com/technetwork/java/javase/8u111-relnotes-3124969.html

将它留在这里,因为我研究了这个问题一个小时。