我们的applet支持Microsoft ISA Server,它集成了代理身份验证.Isa代理服务器为没有身份验证凭据的连接返回http 405( NOT 407 )。我的{{1} } class不会被调用。 如何在这种情况下验证我与代理服务器的连接?
Applet使用java1.6进行签名和编译。 java.net.Authenticator
类用于连接。
答案 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 site和this site对于查看核心Java类的工作方式非常有用。如果您需要支持HTTPS,则需要对该协议进行类似的更改。
希望这些解决方案中的一个对您有用。我不完全确定后一种方法可以在Applet的安全约束内工作。前者应该。如果您能够使用它,则可能更容易使用不同的HTTP库,例如Apache HttpComponents。