服务器端目录结构如图。在上一篇博文中的项目的基础上添加了一个interceptor类。

wKioL1Q8kk-DplvyAADvU5BQWGQ196.jpg

CheckUserInterceptor.java拦截器

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配置拦截器

<?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拦截器

wKiom1Q8koyBErjrAAD0uOR3F_o790.jpg

AddUserInterceptor.java拦截器

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 配置客户端拦截器

<?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>


参考 http://shamrock.blog.51cto.com/2079212/1563384