服務器端目錄結構如圖。在上一篇博文中的項目的基礎上添加了一個interceptor類。
java
CheckUserInterceptor.java攔截器spring
package com.umgsai.interceptors; import javax.xml.namespace.QName; 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; //檢查用戶的 攔截器 public class CheckUserInterceptor extends AbstractPhaseInterceptor<SoapMessage> { public CheckUserInterceptor() { super(Phase.PRE_PROTOCOL);// 準備協議化時攔截 } @Override public void handleMessage(SoapMessage message) throws Fault { Header header = message.getHeader(new QName("atguigu")); if (header != null) { Element element = (Element) header.getObject(); String username = element.getElementsByTagName("username").item(0).getTextContent(); String password = element.getElementsByTagName("password").item(0).getTextContent(); if (username.equals("umgsai")&&password.equals("123456")) { System.out.println("經過攔截器..."); return; } } //不能經過 System.out.println("沒有經過攔截器"); throw new Fault(new RuntimeException("用戶名或密碼不正確")); } }
beans-xml配置攔截器
apache
<?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"> <!-- 引入CXF的核心配置 --> <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" /> <jaxws:endpoint id="orderWS" implementor="com.umgsai.ws.impl.OrderWSImpl" address="/orderWS"> <jaxws:inInterceptors> <bean class="com.umgsai.interceptors.CheckUserInterceptor"> </bean> </jaxws:inInterceptors> </jaxws:endpoint> </beans>
客戶端攔截interceptor攔截器服務器
AddUserInterceptor.java攔截器app
package com.umgsai.ws.interceptors; 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.interceptor.Fault; import org.apache.cxf.phase.AbstractPhaseInterceptor; import org.apache.cxf.phase.Phase; import org.apache.xml.utils.DOMHelper; import org.w3c.dom.Document; import org.w3c.dom.Element; public class AddUserInterceptor extends AbstractPhaseInterceptor<SoapMessage> { private String username; private String password; public AddUserInterceptor(String username, String password) { super(Phase.PRE_PROTOCOL);// 準備協議化時攔截 this.username = username; this.password = password; System.out.println("建立AddUserInterceptor實例..."); } /* * <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Header> <atguigu> <username>umgsai</username> <password>123456</password> </atguigu> </soap:Header> <soap:Body> <ns1:sayHi xmlns:ns1="http://demo.com/"> <text>test~~~</text> </ns1:sayHi> </soap:Body> </soap:Envelope> * * */ @Override public void handleMessage(SoapMessage message) throws Fault { List<Header> headers = message.getHeaders(); Document document = DOMHelper.createDocument(); Element rootElement = document.createElement("atguigu"); Element usernameElement = document.createElement("username"); usernameElement.setTextContent(username); rootElement.appendChild(usernameElement); Element passwordElement = document.createElement("password"); passwordElement.setTextContent(password); rootElement.appendChild(passwordElement); headers.add(new Header(new QName("atguigu"), rootElement)); System.out.println("攔截..."); } }
beans-client.xml 配置客戶端攔截器
dom
<?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:client id="orderClient" serviceClass="com.umgsai.ws.OrderWS" address="http://localhost:8080/WS_spring/orderWS"> <jaxws:outInterceptors> <bean class="com.umgsai.ws.interceptors.AddUserInterceptor"> <constructor-arg name="username" value="umgsai"/> <constructor-arg name="password" value="123456"/> </bean> </jaxws:outInterceptors> </jaxws:client> </beans>