服務端(CXF發布webservice):
1、 http://cxf.apache.org/download.html下載 cxf文件包(3.1.18必須使用Java 7或Java 8)。
2、 將下載包的lib文件夾下的jar全部拷貝到spring項目中的lib目錄下,注意刪除相同的jar包(版本號不同拷貝不會替換)。
3、 刪除以下4個jar包:
cxf-services-ws-discovery-api-3.1.5.jar
cxf-services-ws-discovery-service-3.1.5.jar
cxf-services-wsn-api-3.1.5.jar
cxf-services-wsn-core-3.1.5.jar
4、 web.xml配置如下:
<!-- 配置cxf框架 cxf-servlet.xml --> <servlet> <servlet-name>cxf</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> <init-param> <param-name>config-location</param-name> <param-value>classpath:conf/cxf-servlet.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>cxf</servlet-name> <url-pattern>/webservice/*</url-pattern> </servlet-mapping>
5、 conf目錄下添加cxf-servlet.xml文件, cxf-servlet.xml配置如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <!-- 加載提供的服務 --> <jaxws:endpoint id="helloService" address="/MyWebService" implementor="net.evecom.hr.MyWebService"></jaxws:endpoint> </beans>
7、 在net.evecom.hr目錄下創建MyWebService類,如下:
package net.evecom.hr; import javax.jws.WebParam; import javax.jws.WebService; @WebService public class MyWebService { public String hiMyService(@WebParam(name = "content") String content) { System.out.println("客戶端發送過來了:" + content); return "服務器返回:" + content; } }
8、啟動tomcat,訪問localhost:8080/項目名/webservice/,查看是否正常啟動。
客戶端(axis2獲取webservice):
1、 http://axis.apache.org/axis2/java/core/download.html下載axis2-1.7.9;
2、 將下載包lib文件夾下的jar包復制到另一個項目lib目錄下;
3、 測試代碼如下:
package net.evecom.hr; import java.util.Iterator; import javax.xml.namespace.QName; import org.apache.axiom.om.OMAbstractFactory; import org.apache.axiom.om.OMElement; import org.apache.axiom.om.OMFactory; import org.apache.axiom.om.OMNamespace; import org.apache.axis2.AxisFault; import org.apache.axis2.addressing.EndpointReference; import org.apache.axis2.client.Options; import org.apache.axis2.client.ServiceClient; import com.alibaba.fastjson.JSONObject; public class Test { public static void main(String[] args) { // TODO Auto-generated method stub String url = "http://localhost:8080/項目名/webservice/MyWebService?wsdl"; sendWsdl(url, "啊啊啊啊啊"); } public static void sendWsdl(String url, String xmlStr) { JSONObject res = new JSONObject(); try { String endpoint = url.replace("?wsdl", "");// 不需要傳?wsdl // 直接引用遠程的wsdl文件 Options options = new Options(); options.setTo(new EndpointReference(endpoint)); ServiceClient sender = new ServiceClient(); sender.setOptions(options); OMFactory fac = OMAbstractFactory.getOMFactory(); OMNamespace omNs = fac.createOMNamespace("http://hr.evecom.net/", "");// 參數1(uri)=即為wsdl文檔的targetNamespace;參數2(prefix)=可不填 OMElement method = fac.createOMElement("hiMyService", omNs);// 方法名 QName qname = new QName("content"); OMElement in0 = fac.createOMElement(qname);// 方法參數 in0.setText(xmlStr); // 參數值 method.addChild(in0); // 添加參數 OMElement resultEle = sender.sendReceive(method);// 調用wsdl System.out.println("調用接口結果:" + resultEle.toString()); Iterator<?> iterator = resultEle.getChildElements(); OMElement result1 = null; while (iterator.hasNext()) { result1 = (OMElement) iterator.next(); System.out.println(result1.getText()); } } catch (AxisFault ex) { ex.printStackTrace(); } } }
4、運行代碼,查看是否正常返回
至此,簡單的webservice與Spring整合部署完成。
=====================================我是一條分割線============================================
添加攔截器:
- 服務端配置如下:
a) cxf-servlet.xml配置如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <bean id="webServiceInterceptor" class="net.evecom.common.interceptors.WebServiceInterceptor"></bean> <bean id="loggingInInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean> <bean id="loggingOutInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean> <!-- 加載提供的服務 --> <jaxws:endpoint id="webServiceTest" address="/MyWebService" implementor="net.evecom.webservice.hr.MyWebService"> <!-- 添加in攔截器 --> <jaxws:inInterceptors> <ref bean="loggingInInterceptor" /> <ref bean="webServiceInterceptor" /> </jaxws:inInterceptors> <!-- 添加out攔截器 --> <jaxws:outInterceptors> <ref bean="loggingOutInterceptor" /> </jaxws:outInterceptors> </jaxws:endpoint> <!-- <jaxws:server id="webServiceTest" serviceClass="net.evecom.webservice.hr.MyWebService" address="/MyWebService"> <jaxws:serviceBean> <ref bean="MyWebService" /> </jaxws:serviceBean> </jaxws:server> --> </beans>
b) 添加WebServiceInterceptor,代碼如下:
/* * Copyright (c) 2005, 2016, EVECOM Technology Co.,Ltd. All rights reserved. * EVECOM PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * */ package net.evecom.common.interceptors; import java.util.List; import org.apache.cxf.binding.soap.SoapMessage; import org.apache.cxf.headers.Header; import org.apache.cxf.interceptor.Fault; import org.apache.cxf.phase.AbstractPhaseInterceptor; import org.apache.cxf.phase.Phase; import org.w3c.dom.Element; import net.evecom.common.util.MD5; public class WebServiceInterceptor extends AbstractPhaseInterceptor<SoapMessage> { private static final String TOKEN = "test"; public WebServiceInterceptor(String phase) { super(phase); } public WebServiceInterceptor() { super(Phase.PRE_INVOKE); } public void handleMessage(SoapMessage message) throws Fault { List<Header> headers = message.getHeaders(); if (headers == null || headers.size() == 0) { throw new Fault(new IllegalArgumentException("沒有Header,攔截器實施攔截")); } Header firstHeader = headers.get(0); Element ele = (Element) firstHeader.getObject(); String token = ele.getFirstChild().getTextContent(); if (!token.equals(MD5.parseMD5(TOKEN))) { throw new Fault(new IllegalArgumentException("token不正確")); } } }
- 客戶端需要在發送請求時,添加頭消息(token=md5.parseMD5(“test”)),代碼如下:
// 創建消息頭:token=evecomoa SOAPFactory soapFactory = OMAbstractFactory.getSOAP11Factory(); // SOAPHeaderBlock soapHeader = soapFactory.createSOAPHeaderBlock("RequestHeader", omNamespace); // 添加頭消息內容 SOAPHeaderBlock soapHeaderBlock = soapFactory.createSOAPHeaderBlock("token", omNamespace); soapHeaderBlock.addChild(soapFactory.createOMText(MD5.parseMD5("test"))); // soapHeader.addChild(soapHeaderBlock); // 將消息頭加入到當前消息中 sender.addHeader(soapHeaderBlock);