上一遍简单介绍了webservice和写了简单的cxf入门小程序
地址:http://blog.csdn.net/cjaver/article/details/38777057
接下来介绍一个比较实用的拦截器,可以进行权限控制等。
首先对于 一个 webservice来说
服务器端 : 有输入有输出(soap)
客户端: 同上
所以对于添加拦截器来说,也是有 In 拦截器 跟 Out拦截器
这里简单写一个服务器端的 In拦截器(控制发送过来的消息必须有 用户名,密码,所以添加的In拦截器)
public class AuthIntercetor extends AbstractPhaseInterceptor<SoapMessage> {
public AuthIntercetor() {
super(Phase.PRE_INVOKE);//调用之前
}
@Override
/***
* 参数是message是soap 协议的内容
*/
public void handleMessage(SoapMessage message) throws Fault {
System.out.println("自定义拦截器工作...");
//获得header
List<Header> headers = message.getHeaders();
if(headers==null || headers.size()<1){
throw new Fault(new IllegalArgumentException("没有Header,不给你调用,哈哈哈..."));
}
//这里假设约定第一个header为用户名 密码
Header header = headers.get(0);
Element element = (Element) header.getObject();
String user = element.getElementsByTagName("userid").item(0).getTextContent();
String pass = element.getElementsByTagName("pass").item(0).getTextContent();
if(!"wang".equals(user) || !"111".equals(pass)){
throw new Fault(new IllegalArgumentException("用户名或者密码不正确,不能调用..."));
}
}
}
在SOAP中,body部分是不能认为修改的,所以要权限控制什么的,只能修改header头信息
上如只是简单演示获取客户端传过来的soap中的header并且进行比较
如果不满足条件则,抛出一个 Fault ,CXF中的一个类,从而阻止客户端调用。
发布的时候添加 In拦截器
public class Publish {
public static void main(String[] args) {
ITimeService iTimeService = new TimeServiceImpl();
EndpointImpl endpointImpl = (EndpointImpl) Endpoint.publish("http://localhost:9999/time", iTimeService);
endpointImpl.getInInterceptors().add(new AuthIntercetor());
//endpointImpl.getOutInterceptors().add(new LoggingInInterceptor());
System.out.println("Web service接口暴露成功...");
}
}
对于客户端来说也是如此
可以写一个 Out拦截器,对发送出去消息添加header头 ,在这里就不再赘述了,大家有什么问题可以留言。