Webservice:CXF添加拦截器实现权限控制

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





郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。