需要HTTP 407代理身份验证:如何使用Java代码处理


问题内容

System.setProperty(“http.proxySet”, “true”);
System.setProperty("java.net.useSystemProxies”, “true”);
System.setProperty(“http.proxyHost”, “192.168.1.103”);
System.setProperty(“http.proxyPort”, “3128”);
System.setProperty(“http.proxyUser”, “user123”);
System.setProperty(“http.proxyPassword”, “passwD123”);

url = new URL("http://www.google.co.in");

每次使用此代码时,都会抛出IOException异常,该异常表示HTTP
响应代码407。HTTP407表示需要进行代理身份验证。为什么
在设置proxyUser和proxyPassword时会出现此问题。在此处输入图片说明
如果我输入了错误的密码,则会出现http 401,但它始终会给我407,这意味着
我的代码未使用用户名和密码。在上面的代码中,user123是用户名
,passwD123是用于代理身份验证的密码。


问题答案:

http://blog.vinodsingh.com/2008/05/proxy-authentication-in-java.html

感谢Vinod Singh先生,我找到了解决方案。

Java中的代理身份验证

普通的公司网络通过代理服务器提供Internet访问,有时还需要身份验证。可能应用程序会打开
与公司Intranet外部服务器的连接。因此,必须以编程方式进行代理身份验证。幸运的是,Java提供了一种
透明的机制来执行代理身份验证。

创建一个像下面这样的简单类-

import java.net.Authenticator;

class ProxyAuthenticator extends Authenticator {

    private String user, password;

    public ProxyAuthenticator(String user, String password) {
        this.user = user;
        this.password = password;
    }

    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(user, password.toCharArray());
    }
}

并在您的代码打开URLConnection-之前放置这些代码行

Authenticator.setDefault(new ProxyAuthenticator("user", "password"));
System.setProperty("http.proxyHost", "proxy host");
System.setProperty("http.proxyPort", "port");

现在,所有呼叫将成功通过代理身份验证。