我们的小程序位于集成了代理身份验证的 Microsoft ISA Server 后面。Isa 代理服务器为没有身份验证凭据的连接返回 http 405( NOT 407java.net.Authenticator
)。我的课程没有被调用。在这种情况下,如何验证与代理服务器的连接?
Applet 使用 java1.6 签名和编译。URLConnection
类用于连接。
问问题
2287 次
1 回答
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());
然后,您可以通过在初始化代码中的某处调用来使用此对象。我发现这个站点和这个站点对于查看核心 Java 类的工作方式很有用。如果您需要支持 HTTPS,那么您将需要对该协议进行类似的更改。
希望这些解决方案之一对您有用。我不完全确定后一种方法是否可以在 Applet 的安全约束内工作。前者应该。如果您能够使用它,使用不同的 HTTP 库(例如Apache HttpComponents)也可能更容易做到这一点。
于 2011-07-26T16:24:35.220 回答