1.產生用戶端代碼
cmd下進入項目Src目錄下:cd D:\Workspaces\MyEclipse 10\WebService_CXF_Client\srcD:產生用戶端代碼 wsdl2java wdsl地址
wsdl2java http://localhost:8080/WebService_CXF/WebService/userManager/UserServiceWs?wsdl
2.編寫用戶端攔截器(添加使用者名稱告訴服務端自己是合法調用者)
package interceptor;import java.util.List;import javax.xml.namespace.QName;import org.apache.cxf.binding.soap.SoapMessage;import org.apache.cxf.headers.Header;import org.apache.cxf.helpers.DOMUtils;import org.apache.cxf.interceptor.Fault;import org.apache.cxf.phase.AbstractPhaseInterceptor;import org.apache.cxf.phase.Phase;import org.apache.log4j.Logger;import org.w3c.dom.Document;import org.w3c.dom.Element;public class AuthInterceptor extends AbstractPhaseInterceptor<SoapMessage> {Logger logger=Logger.getLogger(AuthInterceptor.class);private String userName;private String passWord;public AuthInterceptor(String userName, String passWord) {//在發送訊息之前調用super(Phase.PREPARE_SEND);this.userName=userName;this.passWord=passWord;}@Overridepublic void handleMessage(SoapMessage msg) throws Fault {List<Header> headers=msg.getHeaders();//建立DocumentDocument doc=DOMUtils.createDocument();//此處的Element名字根據服務端指定Element eleName=doc.createElement("userName");eleName.setTextContent(this.userName);Element elePass=doc.createElement("passWord");elePass.setTextContent(this.passWord);Element eleHead=doc.createElement("authHead");eleHead.appendChild(eleName);eleHead.appendChild(elePass);/* * <authHead><userName>rain</userName><passWord>rain</passWord></authHead> * * *///把ele封裝成Head並添加到Soap訊息的Header列表中headers.add(new Header(new QName("rain"), eleHead));}}
3.Spring配置
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://cxf.apache.org/jaxwshttp://cxf.apache.org/schemas/jaxws.xsd"><import resource="classpath:META-INF/cxf/cxf.xml" /><import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /><import resource="classpath:META-INF/cxf/cxf-servlet.xml" /><!-- Bean ID,發布的地址,實現的介面,攔截器1,攔截器2--><jaxws:client id="userWsClient" address="http://localhost:8080/WebService_CXF/WebService/userManager/UserServiceWs" serviceClass="com.cxf.ws.IUserServiceWs"><jaxws:outInterceptors><bean class="interceptor.AuthInterceptor"><constructor-arg value="rain"/><constructor-arg value="rain"/></bean><bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"/></jaxws:outInterceptors></jaxws:client></beans>
4測試
package Client;import org.junit.BeforeClass;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.cxf.ws.IUserServiceWs;import com.cxf.ws.UserMan;public class TestClient {@BeforeClasspublic static void setUpBeforeClass() throws Exception {}@Testpublic void test() {ApplicationContext app=new ClassPathXmlApplicationContext("spring-test.xml");IUserServiceWs service= app.getBean("userWsClient", IUserServiceWs.class);UserMan man=service.getUserByName("ddd");System.out.println(man.getName()+man.getPassword());}//發出的Soap訊息格式 // http://localhost:8080/WebService_CXF/WebService/userManager/UserServiceWs?wsdl // <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> // <soap:Header> // <authHead> // <userName>rain1</userName> // <passWord>rain</passWord> // </authHead> // </soap:Header> // <soap:Body> // <ns2:getUserByName xmlns:ns2="http://ws.cxf.com/"> // <UserName>AA</UserName> // </ns2:getUserByName> // </soap:Body> //</soap:Envelope>}