Java 为CXF Httpx27设置代理授权策略;行不通
我正在使用CXF3.1.5,我正在尝试使它与代理一起工作。如果代理没有用户名和密码,那么它可以工作;如果代理有用户名和密码,那么它就不起作用。这是我的代码:Java 为CXF Httpx27设置代理授权策略;行不通,java,proxy,cxf,Java,Proxy,Cxf,我正在使用CXF3.1.5,我正在尝试使它与代理一起工作。如果代理没有用户名和密码,那么它可以工作;如果代理有用户名和密码,那么它就不起作用。这是我的代码: //to create my own http conduit bus.setExtension(new TLSAndProxySupportedHTTPConduitFactory(settings, HTTPConduitFactory.class); //to get wsdl definition Definition defini
//to create my own http conduit
bus.setExtension(new TLSAndProxySupportedHTTPConduitFactory(settings, HTTPConduitFactory.class);
//to get wsdl definition
Definition definition = bus.getExtension(WSDLManager.class).getDefinition(uri);
TlsandProxySupportedHttpConductFactory实现了HttpConductFactory,并将创建一个TlsandProxySupportedHttpConductor,它扩展了URLConnectionHttpConductor,在TlsandProxySupportedHttpConductor中,以下是代理设置的相关代码: //HTTPClientPolicy settings works
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
httpClientPolicy.setProxyServer(proxy.getHostName());
httpClientPolicy.setProxyServerPort(proxy.getPort());
this.setClient(httpClientPolicy);
if (proxy.getUserName() != null) {
//ProxyAuthorizationPolicy settings doesn't work
this.getProxyAuthorization().setUserName(proxy.getUserName());
this.getProxyAuthorization().setPassword(proxy.getPassword());
}
请记住,如果代理没有用户名和密码,则一切正常。如果加载WSDL定义的目标URL是以https启动的(我需要https),则代理无法工作。如果它是从http开始的,那么带有用户名和密码的代理运行良好。找到解决方案:原因是 Sun Microsystems的Java安全套接字扩展(JSSE)库允许您通过代理隧道从防火墙后面访问安全的Web服务器。为此,JSSE应用程序需要设置https.ProxyHost和https.ProxyPort系统属性。JSSE中的隧道代码检查代理响应中的“HTTP 1.0”。如果您的代理像许多代理一样返回“HTTP1.1”,您将得到一个IOException。在这种情况下,您需要实现自己的HTTPS隧道协议 参考资料:
及
然后您可以覆盖URLConnectionHttpConductor的方法setupConnection
@Override
protected void setupConnection(Message message, Address address, HTTPClientPolicy csPolicy) throws IOException {
super.setupConnection(message, address, csPolicy);
HttpURLConnection connection = (HttpURLConnection) message.get(KEY_HTTP_CONNECTION);
decorateHttpsURLConnection((HttpsURLConnection) connection);\
message.put(KEY_HTTP_CONNECTION, connection);
}
在decorateHttpsURLConnection方法中:
httpsConnection.setSSLSocketFactory(new SSLTunnelSocketFactory(getProxy(), sslContext.getSocketFactory()));