web service 自定义拦截器

来源:互联网 发布:kindle知乎 编辑:程序博客网 时间:2024/06/10 06:27

客户端拦截器:

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 LoginInterceptor extends AbstractPhaseInterceptor<SoapMessage>{private String name;private String password;public LoginInterceptor() {super(Phase.PRE_PROTOCOL);}public LoginInterceptor(String name,String password) {super(Phase.PRE_PROTOCOL);this.name=name;this.password=password;}@Overridepublic 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().....");}}

客户端测试代码:

package com.xh.ws.test;import org.apache.cxf.endpoint.Client;import org.apache.cxf.frontend.ClientProxy;import org.apache.cxf.interceptor.LoggingOutInterceptor;import com.xh.ws.interceptor.LoginInterceptor;import com.xh.ws.sei.SayHello;import com.xh.ws.sei.SayHelloImplService;public class ClientTest {public static void main(String[] args) {SayHelloImplService factory=new SayHelloImplService();SayHello hello=factory.getSayHelloImplPort();Client client=ClientProxy.getClient(hello);//添加自定义拦截器client.getOutInterceptors().add(new LoginInterceptor("zhangsan","123456"));//添加日志拦截器client.getOutInterceptors().add(new LoggingOutInterceptor());System.out.println(hello.sayHello("lili"));}}

服务端拦截器:

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 LoginInterceptor extends AbstractPhaseInterceptor<SoapMessage>{public LoginInterceptor() {super(Phase.PRE_INVOKE);}@Overridepublic 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("zhangsan".equals(name_1)&&"123456".equals(password_1)){return;}else{throw new RuntimeException("用户名或密码不正确!");}}}}

服务端测试代码:

package com.xh.ws.test;import javax.xml.ws.Endpoint;import org.apache.cxf.interceptor.LoggingInInterceptor;import org.apache.cxf.jaxws.EndpointImpl;import com.xh.ws.interceptor.LoginInterceptor;import com.xh.ws.sei.SayHelloImpl;public class ServerTest {public static void main(String[] args) {Endpoint endpoint=Endpoint.publish("http://127.0.0.1:54321", new SayHelloImpl());EndpointImpl endpointImpl=(EndpointImpl) endpoint;//添加自定义拦截器endpointImpl.getInInterceptors().add(new LoginInterceptor());//添加日志拦截器endpointImpl.getInInterceptors().add(new LoggingInInterceptor());System.out.println("发布成功");}}


结果:

当正确时:

Client:handleMessage().....三月 01, 2016 4:14:11 下午 org.apache.cxf.services.SayHelloImplService.SayHelloImplPort.SayHello信息: Outbound Message---------------------------ID: 1Address: http://127.0.0.1:54321/Encoding: UTF-8Http-Method: POSTContent-Type: text/xmlHeaders: {Accept=[*/*], SOAPAction=[""]}Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Header><user><name>zhangsan</name><password>123456</password></user></soap:Header><soap:Body><ns2:sayHello xmlns:ns2="http://sei.ws.xh.com/"><arg0>lili</arg0></ns2:sayHello></soap:Body></soap:Envelope>--------------------------------------lili

错误时:

Client:handleMessage().....三月 01, 2016 4:37:17 下午 org.apache.cxf.services.SayHelloImplService.SayHelloImplPort.SayHello信息: Outbound Message---------------------------ID: 1Address: http://127.0.0.1:54321/Encoding: UTF-8Http-Method: POSTContent-Type: text/xmlHeaders: {Accept=[*/*], SOAPAction=[""]}Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Header><user><name>zhangsan</name><password>1234561</password></user></soap:Header><soap:Body><ns2:sayHello xmlns:ns2="http://sei.ws.xh.com/"><arg0>lili</arg0></ns2:sayHello></soap:Body></soap:Envelope>--------------------------------------Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: 用户名或密码不正确!at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:161)at com.sun.proxy.$Proxy34.sayHello(Unknown Source)at com.xh.ws.test.ClientTest.main(ClientTest.java:21)Caused by: org.apache.cxf.binding.soap.SoapFault: 用户名或密码不正确!


相关参考资料:

http://huiseyiyu.iteye.com/blog/1172160




0 0