我必须调用需要自定义客户端身份验证的WS。此身份验证由客户端上运行的程序完成,并在http://127.0.0.1:80上进行侦听。 所以我在启动时添加了一个ProxySelector:
final ProxySelector ps = new ProxySelector() {
@Override
public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
ioe.printStackTrace();
}
@Override
public List<Proxy> select(URI uri) {
final List<Proxy> proxy = new ArrayList<Proxy>();
final SocketAddress adr = new InetSocketAddress("127.0.0.1", 80);
final Proxy p = new Proxy(Proxy.Type.HTTP, adr);
proxy.add(p);
return proxy;
};
ProxySelector.setDefault(ps);
这种用法工作正常,但经过一些重构(与WS调用无关),而不是将 http://my.server.com 作为URI输入,我有套接字://my.server.com 并且它失败并显示“未知代理类型:HTTP”,SOCKET方案似乎很正常......
我的旧应用程序和新应用程序之间的区别是HttpUrlConnection.plainConnect()期间的行为不一样。实际上,工作版本使用正确的URI调用我的ProxySelector(http://www.docjar.com/html/api/sun/net/www/protocol/http/HttpURLConnection.java.html的第922行), 而新版本跳转到第959行并开始创建一个新的底层连接,最终得到一个socket:// scheme。
所以区别在于以下几行:
ProxySelector sel =
java.security.AccessController.doPrivileged(
new java.security.PrivilegedAction<ProxySelector>() {
public ProxySelector run() {
return ProxySelector.getDefault();
}
});
这用于将我的ProxySelector返回为“sel”,但现在返回null。
有人可以解释一下这些行的确切含义,以及为什么结果与我以前的应用程序不一样?
答案 0 :(得分:0)
最终,我想出来了!
用于生成WS客户端的jaxws-maven-plugin在工作应用程序中的版本为1.10,在新版本中更改为1.12,如上所述,它引入了HttpUrlConnection中的更改。
仍然不知道发生了什么,以及哪个依赖库在1.10和1.12之间发生了变化,但是创建HttpConnections的方式存在很大差异:)
非常感谢那些阅读我奇怪问题的人...... ^^