接上篇: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>