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