需要 http 407 代理身份验证:如何处理 java 代码

2022-09-02 12:04:22
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。HTTP 407 表示需要代理身份验证。为什么在我设置代理用户和代理密码时会出现此问题。enter image description here
如果我输入错误的密码,http 401将发生,但它总是给我407,这意味着我的代码不采用用户名和密码。在上面的代码中,user123是用户名,passwD123是代理身份验证的密码。


答案 1

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

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

Java 中的代理身份验证

通常的企业网络通过代理服务器提供互联网访问,有时它们也需要身份验证。应用程序可以打开与公司内部网外部服务器的连接。因此,必须以编程方式进行代理身份验证。幸运的是,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());
    }
}

并将这些代码行放在代码打开URL连接之前 -

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

现在,所有调用都将成功通过代理身份验证。


答案 2

对于一般情况,使用 的答案是正确的。但是,在 Java 8u111 及更高版本中,HTTP 407 的另一个原因是,如果对代理使用 BASIC 身份验证。Authenticator

在这种情况下,请添加以下系统属性:

-Djdk.http.auth.tunneling.disabledSchemes=

我从以下位置发现了这一点:https://confluence.atlassian.com/kb/basic-authentication-fails-for-outgoing-proxy-in-java-8u111-909643110.html


推荐