可能有一个客户端解决方案。
我们可以互动的行动点在这里:
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
我们将提供一个自己的(包装的)HttpURLConnection
,它将处理JSESSIONID
. 但不幸的是,我们必须更进一步。
诀窍是我们注册了一个新协议,例如“xhttp”,我们用它来包装一个真正的“http”协议连接。因此,您的 URL 将如下所示:
xhttp://www.example.com/...
首先,定义一个URLStreamHandlerFactory
类
public class MyURLStreamHandlerFactory implements URLStreamHandlerFactory {
public URLStreamHandler createURLStreamHandler(String protocol) {
if ("xhttp".equals(protocol)) {
return new MyURLStreamHandler();
}
return null;
}
}
在 Java(或应用程序)初始化时,我们可以设置它。每个 JVM 只能执行一次。
URLStreamHandlerFactory fac = new MyURLStreamHandlerFactory();
URL.setURLStreamHandlerFactory(fac);
所以,让我们继续吧MyURLStreamHandler
。
public class MyURLStreamHandler extends URLStreamHandler {
@Override
protected URLConnection openConnection(URL url) throws IOException {
return new MyHttpURLConnection(url);
}
}
这很简单,我们创建自己的连接。让我们做一些肮脏的事情:
public final class MyHttpURLConnection extends HttpURLConnection {
private HttpURLConnection conn;
public MyHttpURLConnection(URL url) throws MalformedURLException, IOException {
super(url);
String newUrlString = url.toExternalForm().substring(1);
conn = (HttpURLConnection) new URL(newUrlString).openConnection();
}
@Override
public void disconnect() {
conn.disconnect();
}
@Override
public boolean usingProxy() {
return false;
}
@Override
public void connect() throws IOException {
conn.connect();
conn.setRequestProperty("JSESSIONID", "X");
}
}
瞧,我们设法访问了我们的连接,并设置了JSESSIONID
标题。
您只需要编译您的类,将类文件添加到客户端 jar 中,并使 init 代码在运行上述代码的同一 JVM 中以某种方式运行。
如果做不到,还有另一种可能:将以下系统参数设置为客户端 Java 应用程序:
-Djava.protocol.handler.pkgs=com.example.myprotocol
在这种情况下,创建一个com.example.myprotocol.xhttp
(xhttp就像您的协议名称一样),并将我们的MyURLStreamHandler
类重命名为com.example.myprotocol.xhttp.Handler
. 这是协议解析器将在其中查找它的固定名称。请注意,此java.protocol.handler.pkgs
属性由安全管理器检查。