19
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 表示需要代理身份验证。为什么在我设置 proxyUser 和 proxyPassword 时会出现这个问题。 在此处输入图像描述
如果我输入错误的密码会出现 http 401,但它总是给我 407,这意味着我的代码不使用用户名和密码。在上面的代码中,user123 是用户名,passwD123 是代理认证的密码。

4

3 回答 3

22

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

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

Java中的代理身份验证

通常的公司网络通过代理服务器提供互联网访问,有时它们也需要身份验证。可能应用程序确实会打开与公司 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");

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

于 2013-01-01T20:57:56.650 回答
9

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

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

-Djdk.http.auth.tunneling.disabledSchemes=

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

于 2017-12-01T09:24:43.077 回答
8

@GauravDS你提到:

http://blog.vinodsingh.com/2008/05/proxy-authentication-in-java.html 感谢 Vinod Singh 先生,我找到了解决方案。Java 中的代理身份验证 通常的公司网络通过代理服务器提供 Internet 访问,有时它们也需要身份验证。可能应用程序确实会打开与公司 Intranet 外部的服务器的连接。所以必须以编程方式进行代理身份验证。幸运的是,Java 提供了一种透明的机制来进行代理身份验证。创建一个简单的类,如下所示 - 。
.
.
并在您的代码打开 URLConnection 之前放置这些代码行 - Authenticator.setDefault(new ProxyAuthenticator("user", "password")); System.setProperty("http.proxyHost", "proxy host"); System.setProperty("http.proxyPort", "port"); 现在所有调用都将成功通过代理身份验证。

如果您要连接的站点也需要用户名/密码才能允许您使用,该怎么办。设置默认身份验证器(Authenticator.setDefault)将失败我猜当外部站点将寻找经过身份验证的用户时。

有什么意见吗?....有人吗?

编辑:1 之前使用此代码并收到错误(407)需要代理身份验证。我相信这是因为不同的主机请求了身份验证。并且当您为一台主机设置一个用户/通行证的默认身份验证器时,其他请求主机的身份验证将失败。我昨天对 SimpleAuthenticator 类进行了以下更改,现在它就像一个魅力。

   protected PasswordAuthentication getPasswordAuthentication()
   {
    String requestingHost = getRequestingHost();
    if (requestingHost == proxyHost){
        System.out.println("getPasswordAuthentication() request recieved from->" + requestingHost );
        return new PasswordAuthentication(proxyuser,proxypass.toCharArray());
    }
    else{
        System.out.println("getPasswordAuthentication() request recieved from->" + requestingHost );
        return new PasswordAuthentication(sharepointusername,sharepointpassword.toCharArray());
    }

   }

更多信息在这里:http ://blog.ashwani.co.in/blog/2013-07-29/access-sharepoint-webservices-from-java-behind-proxy/

于 2013-07-29T16:08:19.217 回答