webservice篇之中级开发(三)

    xiaoxiao2021-03-26  36

    在前篇的webservice篇之中级开发(二)的基础上进行编码,添加拦截器,如你要请求一个方法时,要通过验证,才可以继续访问,这就是拦截器!

    上次的简单编码及发布中发不类:

    package com.azj.service; import javax.xml.ws.Endpoint; public class Te { public static void main(String[] args) { Endpoint.publish("http://localhost:8080/fb", new orderSeiImpl());//访问地址自己可以随意谢,后面接接口实现类 System.out.println("发布成功!"); } }

    在打红线的代码改为:

    EndpointImpl proxy = (EndpointImpl)Endpoint.publish("http://localhost:8080/wether", new FbImpl());

    proxy.getInInterceptors().add(new AuthInterceptor());//自定义拦截器 AuthInterceptor拦截器类

    //proxy.getInInterceptors().add(new LoggingInInterceptor());//记录客户端访问的日志 //proxy.getOutInterceptors().add(new LoggingOutInterceptor());//记录服务端输出的日志

    服务端拦截器类:

    package com.azj.service; 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;

    //AbstractPhaseInterceptor继承Interceptor public class MessageInterceptor extends AbstractPhaseInterceptor<SoapMessage> { public MessageInterceptor() { super(Phase.PRE_PROTOCOL);//做好准备工作 } @Override public void handleMessage(SoapMessage ms) throws Fault {

    Header header = ms.getHeader(new QName("azj"));//获取名为"azj"header的信息 Element el = (Element) header.getObject();//获取对象内容 String name = el.getElementsByTagName("name").item(0).getTextContent();//获取属性名为name的值 String pwd = el.getElementsByTagName("pwd").item(0).getTextContent();//获取属性名为pwd的值 if("admin".equals(name) && "admin".equals(pwd)){//简单验证 System.out.println("验证成功!"); } } }

    客户端的发布代码中:

    package com.azj.client; public class Te { public static void main(String[] args) { OrderSeiImpl od=new OrderSeiImpl();//这里是接口的实现类,对于发布xml文档里的

    OderSel proxy = od.getOrderSeiImplPort();//这里是生成的代理类,对于服务端的接口

    String name = proxy.getName("azj");

    System.out.println(name); } }

    红色部分改为:

    OrderSeiImpl od=new OrderSeiImpl();

    OderSel proxy = od.getOrderSeiImplPort();

    Client client = ClientProxy.getClient(proxy); client.getInInterceptors().add(new LoggingInInterceptor());   client.getOutInterceptors().add(new loginInterceptor("admin","admin")); //给服务端发送的参数验证

    //client.getInInterceptors().add(new LoggingInInterceptor());//记录客户端访问的日志 //client.getOutInterceptors().add(new LoggingOutInterceptor());//记录服务端输出的日志

    客户端拦截器的编码:

    package com.client.oders; import java.util.List; import javax.xml.crypto.dom.DOMURIReference; 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 pwd; //实现构造,并对name,pwd赋值 public loginInterceptor(String name,String pwd) { super(Phase.PRE_PROTOCOL); this.name=name; this.pwd=pwd; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } @Override public void handleMessage(SoapMessage mes) throws Fault { //创建Document对象  运用DOMUtils List<Header> headers = mes.getHeaders(); Document doc = DOMUtils.createDocument(); //创建element对象 Element Element = doc.createElement("azj"); //此处创建的元素应该按照服务器那边的要求 Element nameElement = doc.createElement("name"); nameElement.setTextContent(name); Element pwdElement = doc.createElement("pwd"); pwdElement.setTextContent(name); //添加进入标签 Element.appendChild(nameElement); Element.appendChild(pwdElement); //增加一个名为azj的header headers.add(new Header(new QName("azj"), Element)); } }

    这下拦截器就添加成功啦!

    转载请注明原文地址: https://ju.6miu.com/read-663934.html

    最新回复(0)