webService 自定义拦截器

来源:互联网 发布:淘宝gxg代购是正品吗 编辑:程序博客网 时间:2024/05/01 16:28

客户端 拦截器

package com.baidu.cxf.interceptor;import java.util.List;import javax.xml.namespace.QName;import org.apache.cxf.binding.soap.SoapMessage;import org.apache.cxf.interceptor.Fault;import org.apache.cxf.phase.AbstractPhaseInterceptor;import org.apache.cxf.phase.Phase;import org.apache.cxf.headers.Header;import org.apache.cxf.helpers.DOMUtils;import org.w3c.dom.Document;import org.w3c.dom.Element;public class AddPhoneInterceptor extends AbstractPhaseInterceptor<SoapMessage> {private String name;private String password;public AddPhoneInterceptor(String name,String password) {super(Phase.PRE_PROTOCOL);//准备协议化的时候拦截this.name = name;this.password = password;}/** * <chuck> * <name>text</name> * <password>text</password> * </chuck> */@Overridepublic void handleMessage(SoapMessage msg) throws Fault {List<Header> headers = msg.getHeaders();//创建documentDocument document = DOMUtils.createDocument();// 创建根节点 Element 其必须是 org.w3c.dom.Element Element rootElement = document.createElement("Chuck");//创建rootElement 的子节点 nameElementElement nameElement = document.createElement("Name");//设置nameElement 的标签体(即:验证的用户名)nameElement.setTextContent(name);//把 子标签nameElement 放入 根标签rootElement中rootElement.appendChild(nameElement);//创建子节点 passwordElement 其余同上Element passwordElement = document.createElement("Password");passwordElement.setTextContent(password);rootElement.appendChild(passwordElement);headers.add(0,new Header(new QName("Chuck"), rootElement));System.out.println("client handleMessage()..");}}



服务端拦截器:

package com.baidu.cxf.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.interceptor.Fault;import org.apache.cxf.phase.AbstractPhaseInterceptor;import org.apache.cxf.phase.Phase;import org.w3c.dom.Element;public class ChuckPhoneInterceptor extends AbstractPhaseInterceptor<SoapMessage> {//private String name;//private String password;//public ChuckPhoneInterceptor() {super(Phase.PRE_PROTOCOL);//准备协议化的时候拦截}/** * <Envelope> * <head> * <chuck> * <name>用户名</name> * <password>密码</password> * </chuck>  * <chuck> * <name>用户名</name> * <password>用户名</password> * </chuck> * <head> * <Body> * <sayHello> * <arg0>Bob</arg0> * </sayHello> * </Body> * </Envelope> */@Overridepublic void handleMessage(SoapMessage msg) throws Fault {System.out.println("msg: " + msg);// Header header = msg.getHeader(new QName("Chuck")); List<Header> headers = msg.getHeaders();  if(headers != null && headers.size() >1){ Header header = headers.get(0);Element rootElement = (Element) header.getObject();//getElementsByTagName("Name") 获取的是一个name的集合 ,所以需要 取item 0 位上的值String name = rootElement.getElementsByTagName("Name").item(0).getTextContent();String password = rootElement.getElementsByTagName("Password").item(0).getTextContent();System.out.println("Name :" + name + " Password:" + password );if(name.equals("hhh") && password.equals("mm")){System.out.println("Service 通过拦截器");return;} }  System.out.println("Service 没有通过拦截器"); throw new  Fault(new RuntimeException("请求需要一个正确的用户名和密码!"));}}


0 0
原创粉丝点击