gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:47:09 30 4
gpt4 key购买 nike

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

Applet 是用java1.6 签名和编译的。 URLConnection 类用于连接。

最佳答案

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

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

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

第二种方法涉及对内部 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,则需要对该协议(protocol)进行类似的更改。

希望其中一种解决方案对您有用。我不完全确定后一种方法是否会在 Applet 的安全限制范围内工作。前者应该。使用不同的 HTTP 库(例如 Apache HttpComponents)也可能更容易做到这一点。如果您能够使用它。

关于java - 在需要身份验证但不返回 407 的代理后面打开 http 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6831415/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com