在前篇的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)); } }
这下拦截器就添加成功啦!
