You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求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:

  1. 创建自定义适配类:
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);
    }
}
  1. 在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();
  1. 移除commons-httpclient-3.1.jar,添加httpclient 4.x依赖即可。

注意事项

  • 优先选择方案一,官方桥接包经过兼容性测试,能减少后续维护成本
  • 替换完成后,需全面测试OpenSAML的HTTP相关功能(如元数据获取、SAML请求发送等)

内容的提问来源于stack exchange,提问作者user9511333

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 21:15:34