CXF客户端使用java.net.URLConnection
连接到服务。该URLConnection的可配置选择这样一个本地IP地址(请参阅How can I specify the local address on a java.net.URLConnection?)
URL url = new URL(yourUrlHere);
Proxy proxy = new Proxy(Proxy.Type.DIRECT,
new InetSocketAddress(
InetAddress.getByAddress(
new byte[]{your, ip, interface, here}), yourTcpPortHere));
URLConnection conn = url.openConnection(proxy);
我曾考察文物cxf-rt-rs-client
和cxf-rt-transports-http
的代码,看看CXF是如何创建的连接。在ProxyFactory是创建所需UrlConnection
private Proxy createProxy(final HTTPClientPolicy policy) {
return new Proxy(Proxy.Type.valueOf(policy.getProxyServerType().toString()),
new InetSocketAddress(policy.getProxyServer(),
policy.getProxyServerPort()));
}
正如你可以看到Proxy
对象的代码,有没有办法来配置IP地址,所以我恐怕这个问题的答案是可以不CXF
配置源IP地址,但是,我认为它不会是很难修改的源代码,允许设置的源IP地址
HTTPClientPolicy
添加以下代码以org.apache.cxf.transports.http.configuration.HTTPClientPolicy
在cxf-rt-transports-http
public class HTTPClientPolicy {
protected byte[] sourceIPAddress;
protected int port;
public boolean isSetSourceIPAddress(){
return (this.sourceIPAddress != null);
}
ProxyFactory里
修改下面的代码来org.apache.cxf.transport.http.ProxyFactory
在cxf-rt-transports-http
//added || policy.isSetSourceIPAddress()
//getProxy() calls finally to createProxy
public Proxy createProxy(HTTPClientPolicy policy, URI currentUrl) {
if (policy != null) {
// Maybe the user has provided some proxy information
if (policy.isSetProxyServer() || policy.isSetSourceIPAddress())
&& !StringUtils.isEmpty(policy.getProxyServer())) {
return getProxy(policy, currentUrl.getHost());
} else {
// There is a policy but no Proxy configuration,
// fallback on the system proxy configuration
return getSystemProxy(currentUrl.getHost());
}
} else {
// Use system proxy configuration
return getSystemProxy(currentUrl.getHost());
}
}
//Added condition to set the source IP address (is set)
//Will work also with a proxy
private Proxy createProxy(final HTTPClientPolicy policy) {
if (policy.isSetSourceIPAddress()){
Proxy proxy = new Proxy(Proxy.Type.DIRECT,
new InetSocketAddress(
InetAddress.getByAddress(
policy.getSourceIPAddress(), policy.getPort()));
} else {
return new Proxy(Proxy.Type.valueOf(policy.getProxyServerType().toString()),
new InetSocketAddress(policy.getProxyServer(),
policy.getProxyServerPort()));
}
}
用法
Client client = ClientProxy.getClient(service);
HTTPConduit http = (HTTPConduit) client.getConduit();
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
httpClientPolicy.setSourceIPAddress(new byte[]{your, ip, interface, here}));
httpClientPolicy.setPort(yourTcpPortHere);
http.setClient(httpClientPolicy);
这是正确的答案,因为这是唯一可行的答案。抱歉,我已将bonty分配给另一个答案。一个重要的细节是,为了让https工作,您需要设置setUseHttpsURLConnectionDefaultSslSocketFactory(true)(在HTTPConduit TLSClientParameters中)。 – user2518618