寻求commons-httpclient-3.1.jar替代方案,解决OpenSAML依赖缺失问题
解决OpenSAML 2.6.6与commons-httpclient 3.1的兼容替代方案
方案一:使用官方适配桥接包
直接引入OpenSAML官方提供的适配组件,它能自动完成新版httpclient与老版本ProtocolSocketFactory接口的映射,无需手动编写适配代码:
- 引入对应版本的
opensaml-httpclient依赖,同时移除commons-httpclient:commons-httpclient:3.1 - 添加稳定版的httpclient 4.x核心包(不推荐直接用5.x,适配性较差)
- Maven依赖配置示例:
<dependency> <groupId>org.opensaml</groupId> <artifactId>opensaml-httpclient</artifactId> <version>2.6.6</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.14</version> </dependency>
方案二:自定义适配类实现兼容
如果不想引入额外桥接包,可以手动实现ProtocolSocketFactory接口,内部调用新版httpclient的API:
- 创建自定义适配类:
import org.apache.commons.httpclient.ConnectTimeoutException; import org.apache.commons.httpclient.params.HttpConnectionParams; import org.apache.commons.httpclient.protocol.ProtocolSocketFactory; import org.apache.http.client.config.RequestConfig; import org.apache.http.conn.socket.LayeredConnectionSocketFactory; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import java.io.IOException; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; public class HttpClient4ProtocolSocketFactory implements ProtocolSocketFactory { private final CloseableHttpClient httpClient; private final LayeredConnectionSocketFactory socketFactory; public HttpClient4ProtocolSocketFactory() { this.socketFactory = SSLConnectionSocketFactory.getSocketFactory(); this.httpClient = HttpClients.custom().setSSLSocketFactory(socketFactory).build(); } @Override public Socket createSocket(String host, int port, InetAddress localAddress, int localPort) throws IOException, UnknownHostException { RequestConfig config = RequestConfig.custom().setLocalAddress(localAddress).setLocalPort(localPort).build(); return socketFactory.createSocket(httpClient.getConnectionManager().getSchemeRegistry(), host, port, config); } @Override public Socket createSocket(String host, int port, InetAddress localAddress, int localPort, HttpConnectionParams params) throws IOException, UnknownHostException, ConnectTimeoutException { int timeout = params.getConnectionTimeout(); RequestConfig config = RequestConfig.custom() .setLocalAddress(localAddress) .setLocalPort(localPort) .setConnectTimeout(timeout) .build(); return socketFactory.createSocket(httpClient.getConnectionManager().getSchemeRegistry(), host, port, config); } @Override public Socket createSocket(String host, int port) throws IOException, UnknownHostException { return socketFactory.createSocket(httpClient.getConnectionManager().getSchemeRegistry(), host, port, null); } }
- 在
DefaultBootstrap.bootstrap()执行前注册自定义工厂:
import org.apache.commons.httpclient.protocol.Protocol; // 注册HTTP和HTTPS协议的自定义适配工厂 Protocol.registerProtocol("http", new Protocol("http", new HttpClient4ProtocolSocketFactory(), 80)); Protocol.registerProtocol("https", new Protocol("https", new HttpClient4ProtocolSocketFactory(), 443)); // 初始化OpenSAML DefaultBootstrap.bootstrap();
- 移除
commons-httpclient-3.1.jar,添加httpclient 4.x依赖即可。
注意事项
- 优先选择方案一,官方桥接包经过兼容性测试,能减少后续维护成本
- 替换完成后,需全面测试OpenSAML的HTTP相关功能(如元数据获取、SAML请求发送等)
内容的提问来源于stack exchange,提问作者user9511333
相关产品推荐
相关产品推荐

