为什么设计**?
1.为了在webservice请求过程中,能动态操作请求和响应数据,CXF设计了**
**分类:
1.按所处的位置分:服务器端**,客户端**。
2.按消息的方向分:入**,出**。
3.按定义者分:系统**,自定义**。
客户端添加日志**
package com.client.interceptor;import java.util.List;import javax.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.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.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"); }}
原标题:Apache CXF自定义拦截器
关键词:Apache