上一遍简单介绍了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头 ,在这里就不再赘述了,大家有什么问题可以留言。
时间: 2024-10-12 21:09:55