在代理后面打开http连接,需要身份验证但不返回407

时间:2011-07-26 14:15:15

标签: java proxy japplet isa authenticator

我们的applet支持Microsoft ISA Server,它集成了代理身份验证.Isa代理服务器为没有身份验证凭据的连接返回http 405( NOT 407 )。我的{{1} } class不会被调用。 如何在这种情况下验证我与代理服务器的连接?

Applet使用java1.6进行签名和编译。 java.net.Authenticator类用于连接。

1 个答案:

答案 0 :(得分:2)

我可以看到解决这个问题的两种方法,但两者都不是很理想。首先,我猜你已经确认发送带有授权信息的请求不会产生405响应代码?如果答案是肯定的,您可以尝试将请求中的Proxy-authorization标题设置为标题:

URL url = new URL("http://location");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestProperty("Proxy-authorization", authorizationValue);

该标头的格式取决于代理服务器所需的授权方案,因此您必须针对您的特定方案进行一些研究。

第二种方法涉及对内部JDK类进行子类化以欺骗响应代码以强制执行正常的代理身份验证路径。首先,这是子类:

public class HttpURLConnection extends sun.net.www.protocol.http.HttpURLConnection {

    @Override
    public int getResponseCode() throws IOException {
        int code = super.getResponseCode();
        if (code == HTTP_BAD_METHOD) {
            code = HTTP_PROXY_AUTH;
            responseCode = code;
        }
        return code;
    }

}

当然,这会掩盖任何实际的405响应,因此可能会产生意想不到的后果。告诉URL对象使用它需要java.net.URLStreamHandlerFactory的子类:

public class URLStreamHandlerFactory extends java.net.URLStreamHandlerFactory {
    @Override
    URLStreamHandler createURLStreamHandler(String protocol) {
        if (!protocol.equals("http")) {
            return null;
        } else {
            return new java.net.URLStreamHandler {
                protected String proxy;
                protected int proxyPort;

                public Handler () {
                    proxy = null;
                    proxyPort = -1;
                }

                public Handler (String proxy, int port) {
                    this.proxy = proxy;
                    this.proxyPort = port;
                }

                @Override
                protected java.net.URLConnection openConnection(URL u) throws IOException {
                        return openConnection(u, (Proxy)null);
                }

                @Override
                protected java.net.URLConnection openConnection(URL u, Proxy p) throws IOException {
                        return new HttpURLConnection(u, p, this);
                }

                @Override
                protected int getDefaultPort() {
                    return 80;
                }

            }
        }
    }
}

然后,您可以通过在初始化代码中的某处调用URL.setURLStreamHandlerFactory(new URLStreamHandlerFactory());来使用此对象。我发现this sitethis site对于查看核心Java类的工作方式非常有用。如果您需要支持HTTPS,则需要对该协议进行类似的更改。

希望这些解决方案中的一个对您有用。我不完全确定后一种方法可以在Applet的安全约束内工作。前者应该。如果您能够使用它,则可能更容易使用不同的HTTP库,例如Apache HttpComponents