package org.shi.cxf; import java.io.FileNotFoundException; import java.io.PrintWriter; import javax.xml.ws.Endpoint; import org.apache.cxf.ext.logging.LoggingOutInterceptor; import org.apache.cxf.interceptor.LoggingInInterceptor; import org.apache.cxf.jaxws.EndpointImpl; import org.shi.cxf.intecepter.AuthInteceptor; import org.shi.cxf.ws.HelloWorld; import org.shi.cxf.ws.QueryCatsByUser; import org.shi.cxf.ws.impl.HelloWorldImpl; import org.shi.cxf.ws.impl.QueryCatsByUserImpl; /** * Web Service 服务器端 主启动类 * @author xiaoshi * */ public class WSServiceStart { public static void main(String[] args) throws FileNotFoundException { //须要暴露的服务 HelloWorld hw = new HelloWorldImpl(); QueryCatsByUser queryCatsByUser = new QueryCatsByUserImpl(); // 调用Endpoint 的 publish方法发布 Web Service 服务 EndpointImpl ep = (EndpointImpl) Endpoint.publish("http://127.0.0.1/shiWS", hw); //自定义拦截器用来来接用户名密码等的信息 ep.getInInterceptors().add(new AuthInteceptor()); System.out.println("web Service 发布成功!"); } }
拦截器的实现java
package org.shi.cxf.intecepter; import java.util.List; 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; /** * 自定义拦截器实现用户名密码等的拦截 * @author xiaoshi * */ public class AuthInteceptor extends AbstractPhaseInterceptor<SoapMessage>{ public AuthInteceptor() { super(Phase.PRE_INVOKE);//该拦截器将会 在 “调用以前” 拦截SOAP 消息 } @Override public void handleMessage(SoapMessage msg) throws Fault { System.out.println("------AuthInteceptor拦截到-----" + msg); List<Header> list = msg.getHeaders(); if(list == null || list.size()<1) { throw new Fault(new IllegalArgumentException("用户不合法,静止访问!")); } System.out.println(list.toString()); } }
而后用户访问的时候会被拦截到web
2 .客户端自定义拦截器apache
package org.shi.cxf; import org.apache.cxf.endpoint.Client; import org.apache.cxf.frontend.ClientProxy; import org.apache.cxf.interceptor.LoggingOutInterceptor; import org.shi.cxf.interceptor.AddHeaderInterceptor; import org.shi.cxf.ws.HelloWorld; import org.shi.cxf.ws.impl.HelloWorldServiceName; /** * web service 客户端 启动方法 * @author xiaoshi * */ public class WSClientStart { public static void main(String[] args) { HelloWorldServiceName servieFactory = new HelloWorldServiceName(); //此处返回的只是远程Web Service的代理; HelloWorld hw = servieFactory.getHelloWorldImplPort(); //自定义拦截器实现请求拦截(就是out拦截) Client client = ClientProxy.getClient(hw); client.getOutInterceptors().add(new AddHeaderInterceptor("shiye","123"));//设置消息头 client.getOutInterceptors().add(new LoggingOutInterceptor());//打印消息请求 System.out.println(hw.sayHi("施爷")); } }
package org.shi.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.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 AddHeaderInterceptor extends AbstractPhaseInterceptor<SoapMessage>{ private String userName; private String pwd; public AddHeaderInterceptor(String userName,String pwd) { super(Phase.PREPARE_SEND); //在准备发送时启用拦截器 this.pwd = pwd; this.userName = userName; } @Override public void handleMessage(SoapMessage msg) throws Fault { List<Header> list = msg.getHeaders(); //建立Document对象 Document doc = DOMUtils.createDocument(); Element element = doc.createElement("authHeader"); //建立服务器端要求的参数类型格式 Element idElement = doc.createElement("userName"); idElement.setTextContent(userName); Element pwdElement = doc.createElement("pwd"); pwdElement.setTextContent(pwd); element.appendChild(idElement); element.appendChild(pwdElement); Header header = new Header(new QName("auth"),element); list.add(header);//添加消息头 } }