近期公司把原有的一个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中加入一段:
如果想要手动指定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);
}
}
这样基本就能搞定,有疑问评论或者私信。