Java对Axis2 WebService 的HTTPS发布和调用

近期公司把原有的一个HTTP的Axis2 WebService改为HTTPS,经过网上一番参考和研究整理如下。

发布https的项目大家应该清楚,不清楚的看这篇文章https://www.cnblogs.com/wanghaoyuhappy/p/5267702.html

接下来是发布HTTPS的web service。
axis2如果需要进行https访问,需要加入全局配置文件axis2.xml(Axis2下提供了三种配置文件,第一种是整个系统的全局配置axis2.xml,第二种是服务配置services.xml,第三种是模块配置module.xml),默认该文件是存储在/WEB-INF/conf/axis2.xml。axis2.xml文件可以在axis2的开发包下获取。

在axis2.xml中加入一段:
class="org.apache.axis2.transport.http.AxisServletListener">
8443

如果想要手动指定axis2.xml文件路径(例如改为config文件夹下)

<init-param>
        <param-name>axis2.xml.path</param-name>
        <param-value>/WEB-INF/config/axis2.xml</param-value>
</init-param>

这样发布就搞定了,接下来看客户端怎么访问。
首先获取https网站证书,参考下方网址:
http://www.cnblogs.com/enenen/p/6238504.html

之后编写java类:

import javax.xml.namespace.QName;

import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;

public class Test4444 {

    static {
    javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(new javax.net.ssl.HostnameVerifier() {
        public boolean verify(String hostname, javax.net.ssl.SSLSession sslSession) {
            // 域名或ip地址
            if (hostname.equals("网址比如:www.baidu.com")) {
                return true;
            }
            return false;
        }
    });
    // 第二个参数为证书的路径
    System.setProperty("javax.net.ssl.trustStore",
            "D:\\Program Files\\Java\\jdk1.8.0_144\\jre\\lib\\security\\jssecacerts");
    System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

    }

    public static void main(String args[]) throws AxisFault {

        sendAxis2();
    }


    /**
     * 发送axis2的接口信息
     * @throws AxisFault
     */
    private static void sendAxis2() throws AxisFault {
        // 使用RPC方式调用WebService
        RPCServiceClient serviceClient = new RPCServiceClient();


        Options options = serviceClient.getOptions();
        // 指定调用WebService的URL
        EndpointReference targetEPR = new EndpointReference(
                "webservice wsdl地址,一直到?前面");
        options.setTo(targetEPR);

        // 指定sayHello方法的参数值,如果有多个,继续往后面增加即可
        Object[] opAddEntryArgs = new Object[] { "参数一", "参数二","参数N..."};
        // 指定sayHello方法返回值的数据类型的Class对象
        Class[] classes = new Class[] { String.class };
        // 在创建QName对象时,QName类的构造方法的第一个参数表示WSDL,文件的命名空间名,也就是元素的targetNamespace属性值
        // 第二个参数是要调用的方法名
        QName opAddEntry = new QName("命名空间", "方法名");
        // 返回参数类型,这个和axis1有点区别
        // invokeBlocking方法有三个参数:
        // 第一个参数的类型是QName对象,表示要调用的方法名;
        // 第二个参数表示要调用的WebService方法的参数值,参数类型为Object[];
        // 第三个参数表示WebService方法的返回值类型的Class对象,参数类型为Class[];
        // 当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new Object[]{}
        // 如果被调用的WebService方法没有返回值,应使用RPCServiceClient类的invokeRobust方法,
        // 该方法只有两个参数,它们的含义与invokeBlocking方法的前两个参数的含义相同
        Object ret = serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs,classes)[0];
        System.out.println(ret);
    }

}

这样基本就能搞定,有疑问评论或者私信。

你可能感兴趣的:(Java对Axis2 WebService 的HTTPS发布和调用)