gpt4 book ai didi

java - 绑定(bind)CXF Client源IP地址

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:21:19 26 4
gpt4 key购买 nike

我有一个连接到 Web 服务的 CXF 客户端。此客户端安装在同一网络中有两个 IP 地址的机器上(例如 172.16.1.101 和 172.16.1.102)。

如何将 CXF 客户端配置为使用特定源 IP 地址,以便服务器看到来自该特定 IP 地址而不是其他 IP 地址的请求?

如果我可以访问 Socket,我会做类似的事情:

Socket s = new Socket(); 
s.bind(new InetSocketAddress("172.16.1.102", 0)); //this Ip address is the one I need to specify
s.connect(new InetSocketAddress("google.com", 80));

是否可以配置由 CXF 创建的套接字以便我可以指定源 IP 地址?

编辑:我需要指定源 IP 地址,因为在客户端和 Web 服务器之间有一个防火墙,该防火墙对其中一个 IP 地址有规则(来自另一个 IP 地址的连接被阻止)。

最佳答案

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-clientcxf-rt-transports-http 的代码,以了解 CXF 如何创建连接。在 ProxyFactory是创建 UrlConnection

所需的 Proxy 对象的代码
private Proxy createProxy(final HTTPClientPolicy policy) {
return new Proxy(Proxy.Type.valueOf(policy.getProxyServerType().toString()),
new InetSocketAddress(policy.getProxyServer(),
policy.getProxyServerPort()));
}

如您所见,无法配置 IP 地址,所以恐怕问题的答案是您无法使用 CXF 配置源 IP 地址

但是,我认为修改源代码以允许设置源IP地址并不困难

HTTPClientPolicy

将以下代码添加到 org.apache.cxf.transports.http.configuration.HTTPClientPolicycxf-rt-transports-http

public class HTTPClientPolicy {
protected byte[] sourceIPAddress;
protected int port;

public boolean isSetSourceIPAddress(){
return (this.sourceIPAddress != null);
}

代理工厂

将以下代码修改为 org.apache.cxf.transport.http.ProxyFactory at 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);

关于java - 绑定(bind)CXF Client源IP地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38689303/

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