且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

cxf+Spring的webservice应用--拦截器

更新时间:2022-01-28 00:39:03

接上篇:cxf+Spring的webservice应用



为客户端添加出拦截器:

package com.xh.ws.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.w3c.dom.Document;
import org.w3c.dom.Element;


public class MyInterceptor extends AbstractPhaseInterceptor<SoapMessage>{

	private String name;
	private String password;
	
	
	public MyInterceptor() {
		super(Phase.PRE_PROTOCOL);
		System.out.println("client..MyInterceptor()_1......");
	}


	public MyInterceptor(String name,String password) {
		/**
		 * 此處中有 Phase.PRE_PROTOCOL 時才調用  handleMessage(SoapMessage arg0)
		 * 如果是  Phase.PRE_INVOKE 則不調用  handleMessage(SoapMessage arg0)
		 */
		super(Phase.PRE_PROTOCOL);
		this.name=name;
		this.password=password;
		System.out.println("client..MyInterceptor()_2......");
	}
	
	
	@Override
	public void handleMessage(SoapMessage arg0) throws Fault {
		
		/**
		 * 客户端的head
		 * <user>
		 * 		<name>zhangsan</name>
		 * 		<password>zhangsan</password>
		 * </user>
		 * 	
		 */
			List<Header> heads=arg0.getHeaders();
			
			Document document=DOMUtils.createDocument();
			Element rootEle=document.createElement("user");
			Element nameEle=document.createElement("name");
			nameEle.setTextContent(name);
			Element passwordEle=document.createElement("password");
			passwordEle.setTextContent(password);
			rootEle.appendChild(nameEle);
			rootEle.appendChild(passwordEle);
			heads.add(new Header(new QName("user"), rootEle));
			System.out.println("Client:handleMessage().....");
		
		
	}

}

配置拦截器:bean.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="UserClient" serviceClass="com.xh.ws.sei.SayHello" address="http://localhost:8080/ws_spring_s/userProcess">
        <jaxws:outInterceptors>
        	<bean class="com.xh.ws.interceptor.MyInterceptor">
        		<constructor-arg name="name" value="lina"></constructor-arg>
        		<constructor-arg name="password" value="123123"></constructor-arg>
        	</bean>
        </jaxws:outInterceptors>          
                  
                  
</jaxws:client>
</beans>



为服务端添加拦截器:

package com.xh.ws.interceptor;

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 MyInterceptor extends AbstractPhaseInterceptor<SoapMessage>{

	private String name;
	private String password;
	
	public MyInterceptor() {
		super(Phase.PRE_PROTOCOL);
		System.out.println("server..MyInterceptor()......");
	}


	@Override
	public void handleMessage(SoapMessage arg0) throws Fault {
		
		Header header=arg0.getHeader(new QName("user"));
		if(header!=null)
		{
			/**
			 * 解析header
			 */
			Element rootEle=(Element) header.getObject();
			Element name=(Element) rootEle.getElementsByTagName("name").item(0);
			Element password=(Element) rootEle.getElementsByTagName("password").item(0);
			String name_1=name.getTextContent();
			String password_1=password.getTextContent();
			
			if("lina".equals(name_1)&&"123123".equals(password_1))
			{
				return;
			}else
			{
				throw new RuntimeException("用户名或密码不正确!");
			}
			
			
		}
		
	}

}


配置拦截器:bean.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">
   <import resource="classpath:META-INF/cxf/cxf.xml" /> 
   
   <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> 
   <jaxws:endpoint 
     id="UserProcess" 
     implementor="com.xh.ws.sei.SayHelloImpl" 
     address="/userProcess" >
     	<jaxws:inInterceptors>
     		<bean class="com.xh.ws.interceptor.MyInterceptor">
     		
     		</bean>
     	
     	</jaxws:inInterceptors>
     
     
     </jaxws:endpoint>
     
</beans>