Cxf和Axis使用https进行通信的笔记示例

本文介绍如何使用Cxf和Axis实现HTTPS通信,并提供具体的工具类代码示例。包括证书信任管理、创建WebService代理及忽略证书检查的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. Cxf使用https进行通信

1.1动态生成ws代理的工具类如下:

import org.apache.cxf.configuration.jsse.TLSClientParameters;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.apache.cxf.transport.http.HTTPConduit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import javax.security.cert.CertificateException;
import javax.security.cert.X509Certificate;


public class CXFUtil {
    protected static final Logger LOG = LoggerFactory.getLogger(CXFUtil.class);
    /**
     * 证书信任管理
     */
    private static X509TrustManager tm = new X509TrustManager() {
        public void checkClientTrusted(X509Certificate[] xcs, String string) throws CertificateException {
            //不检查
        }

        public void checkServerTrusted(X509Certificate[] xcs, String string) throws CertificateException {
            //不检查
        }
        @Override
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return null;
        }

        @Override
        public void checkClientTrusted(java.security.cert.X509Certificate[] arg0, String arg1) throws java.security.cert.CertificateException {
            //不检查
        }

        @Override
        public void checkServerTrusted(java.security.cert.X509Certificate[] arg0, String arg1) throws java.security.cert.CertificateException {
            //不检查
        }
    };

    /**
     * 创建webservice代理
     *
     * @param clazz
     * @param wsdl
     * @return
     */
    public static <T> T lookUp(Class<T> clazz, String wsdl) {
        JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
        // 设定接口类
        factory.setServiceClass(clazz);
        factory.setAddress(wsdl);
        // 权限设置拦截器,会在请求发出时将token设置到header中
        // 添加权限设置拦截器
        return (T) factory.create();
    }


    /**
     * 在WebService客户端请求https时,忽略检查服务端证书是否是信任的
     *
     * @param obj
     * @author dongming 2017年3月9日14:58:05
     */
    public static void configureSSLOnTheClient(Object obj) {
        Client client = ClientProxy.getClient(obj);
        HTTPConduit httpConduit = (HTTPConduit) client.getConduit();
        try {
            TLSClientParameters tlsParams = new TLSClientParameters();
            tlsParams.setDisableCNCheck(true);
            tlsParams.setTrustManagers(new TrustManager[]{tm});
            httpConduit.setTlsClientParameters(tlsParams);
            LOG.info("Configure SSL On The Client Success");
        } catch (Exception e) {
            LOG.error("Set Trust Managers Error", e);
        }
    }
}


1.2 使用示例如下:

// IVMSWebService 是使用CXF工具生成的ws类的接口,ip也即wsdl地址
IVMSWebService service = CXFUtil.lookUp(IVMSWebService.class, ip); 

//忽略服务端证书检查 
CXFUtil.configureSSLOnTheClient(service);

2.1 AXIS使用https通信必须的工具类如下:

import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.UnknownHostException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.SocketFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import org.apache.commons.httpclient.ConnectTimeoutException;
import org.apache.commons.httpclient.HttpClientError;
import org.apache.commons.httpclient.params.HttpConnectionParams;
import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;

public class SSLIgnoreErrorProtocolSocketFactory implements ProtocolSocketFactory{

	private SSLContext sslcontext = null;
	
	/**
	* 不进行证明书的验证
	* 
	* @return
	*/
	private static SSLContext createEasySSLContext() {
		try {
			SSLContext context = SSLContext.getInstance("SSL");
			context.init(null, new TrustManager[] { new X509TrustManager() {
				public void checkClientTrusted(X509Certificate[] arg0,
						String arg1) throws CertificateException {
				}
		
				public void checkServerTrusted(X509Certificate[] arg0,
						String arg1) throws CertificateException {
				}
		
				public X509Certificate[] getAcceptedIssuers() {
					return null;
				}
			} }, null);
			return context;
		} catch (Exception e) {
			throw new HttpClientError(e.toString());
		}
	}
	
	private SSLContext getSSLContext() {
		if (this.sslcontext == null) {
			this.sslcontext = createEasySSLContext();
		}
		return this.sslcontext;
	}
	
	@Override
	public Socket createSocket(String host, int port) throws IOException,
		UnknownHostException {
	    return getSSLContext().getSocketFactory().createSocket(host, port);
	}
	
	@Override
	public Socket createSocket(String host, int port, InetAddress clientHost,
		int clientPort) throws IOException, UnknownHostException {
	    return getSSLContext().getSocketFactory().createSocket(host, port,
			clientHost, clientPort);
	}
	
	@Override
	public Socket createSocket(String host, int port, InetAddress localAddress,
		int localPort, HttpConnectionParams params) throws IOException,
		UnknownHostException, ConnectTimeoutException {
		if (params == null) {
			throw new IllegalArgumentException("Parameters may not be null");
		}
		int timeout = params.getConnectionTimeout();
		SocketFactory socketfactory = getSSLContext().getSocketFactory();
		if (timeout == 0) {
			return socketfactory.createSocket(host, port, localAddress,
					localPort);
		} else {
			Socket socket = socketfactory.createSocket();
			SocketAddress localaddr = new InetSocketAddress(localAddress,
					localPort);
			SocketAddress remoteaddr = new InetSocketAddress(host, port);
			socket.bind(localaddr);
			socket.connect(remoteaddr, timeout);
			return socket;
		}
    }
}


2.2 axis使用https通信示例

//stub是使用命令WSDL2Java -uri http://10.66.71.127:28010/?wsdl  -p com.lhever.core  -d adb -s -o build\client 生成的ws代理类
 IVMSWebServiceImpServiceStub stub = new IVMSWebServiceImpServiceStub(ip);//ip也即wsdl地址
 if (ip.contains("https")) { //使用https通信的逻辑在这里
                SSLIgnoreErrorProtocolSocketFactory socketfactory = new SSLIgnoreErrorProtocolSocketFactory();
				
				//Protocol类似包org.apache.commons.httpclient.protocol
                Protocol protocol = new Protocol("https", socketfactory, 18080); //18080也即wsdl中的端口号,为了便于理解代码,此处写死
                stub._getServiceClient().getOptions().setProperty("CUSTOM_PROTOCOL_HANDLER", protocol);
            }
stub.submitJob(); // submitJob是该wsdl发布的一个服务	


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值