Apache CXF自定义拦截器
为什么设计拦截器?
1.为了在webservice请求过程中,能动态操作请求和响应数据,CXF设计了拦截器
拦截器分类:
1.按所处的位置分:服务器端拦截器,客户端拦截器。
2.按消息的方向分:入拦截器,出拦截器。
3.按定义者分:系统拦截器,自定义拦截器。
客户端添加日志拦截器
package com.client.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 AddUserInterceptor extends AbstractPhaseInterceptor<SoapMessage>{ private String name; private String password; /** * * @param name * @param password */ public AddUserInterceptor(String name,String password) { super(Phase.PRE_PROTOCOL);//准备协议化时拦截 // TODO Auto-generated constructor stub this.name=name; this.password=password; } @Override public void handleMessage(SoapMessage msg) throws Fault { // TODO Auto-generated method stub List<Header> headers = msg.getHeaders(); Document document = DOMUtils.createDocument(); Element rootEle = document.createElement("apple"); Element nameEle = document.createElement("name"); nameEle.setTextContent(name); rootEle.appendChild(nameEle); Element passwordEle = document.createElement("password"); passwordEle.setTextContent(password); rootEle.appendChild(passwordEle); headers.add(new Header(new QName("apple"), rootEle)); System.out.println("client handMwssage()...."); } }
服务器端拦截器:
package com.service.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 CheckUser extends AbstractPhaseInterceptor<SoapMessage>{ public CheckUser() { super(Phase.PRE_PROTOCOL); // TODO Auto-generated constructor stub } /* <Envelope> <head> <apple> <name>bo ram</name> <password>520</password> <apple> </head> <Body> <favorite> <arg0>Tara</arg0> <favorite> </Body> </Envelope> */ @Override public void handleMessage(SoapMessage message) throws Fault { // TODO Auto-generated method stub Header header = message.getHeader(new QName("apple")); if(header!=null){ Element appleEle=(Element) header.getObject(); String name = appleEle.getElementsByTagName("name").item(0).getTextContent(); String password = appleEle.getElementsByTagName("password").item(0).getTextContent(); if("bo ram".equals(name)&&"520".equals(password)){ System.out.println("Server 通过拦截器"); return; } } System.out.println("server 没有通过拦截器。。。。。"); throw new Fault(new Exception("请求需要一个正确的用户名和密码")); } }
客户端
package com.cxf_client.client; import java.util.List; import org.apache.cxf.endpoint.Client; import org.apache.cxf.frontend.ClientProxy; import org.apache.cxf.interceptor.Interceptor; import org.apache.cxf.interceptor.LoggingInInterceptor; import org.apache.cxf.interceptor.LoggingOutInterceptor; import org.apache.cxf.message.Message; import com.client.interceptor.AddUserInterceptor; import com.client.simple3.Simple; import com.client.simple3.SimpleimplService; public class Simpleclient2 { public static void main(String[] args) { // TODO Auto-generated method stub SimpleimplService simpleimplService = new SimpleimplService(); Simple simpleimplPort = simpleimplService.getSimpleimplPort(); //发送请求的客户端数据 Client client = ClientProxy.getClient(simpleimplPort); //客户端出拦截器 List<Interceptor<? extends Message>> outInterceptors = client.getOutInterceptors(); outInterceptors.add(new AddUserInterceptor("bo ram", "520")); // //客户端入拦截器 // List<Interceptor<? extends Message>> inInterceptors = client.getInInterceptors(); // inInterceptors.add(new LoggingInInterceptor()); String favorite = simpleimplPort.favorite("Tara"); System.out.println(favorite); } }
服务端
package com.service.server; import java.util.List; import javax.xml.ws.Endpoint; import org.apache.cxf.interceptor.Interceptor; import org.apache.cxf.interceptor.LoggingInInterceptor; import org.apache.cxf.interceptor.LoggingOutInterceptor; import org.apache.cxf.jaxws22.EndpointImpl; import org.apache.cxf.message.Message; import com.service.impl.Simpleimpl; import com.service.interceptor.CheckUser; public class SimpleServer2 { public static void main(String[] args) { // TODO Auto-generated method stub String address="http://localhost:8848/simpleserver/simple"; Endpoint publish = Endpoint.publish(address, new Simpleimpl()); EndpointImpl endpointimpl=(EndpointImpl) publish; //服务端入拦截器 List<Interceptor<? extends Message>> inInterceptors = endpointimpl.getInInterceptors(); inInterceptors.add(new CheckUser()); // //服务端出拦截器 // List<Interceptor<? extends Message>> outInterceptors = endpointimpl.getOutInterceptors(); // outInterceptors.add(new LoggingOutInterceptor()); System.out.println("published"); } }