使用CXF为WebService服务器端添加自定义拦截器进行权限检查

webservice 新民 1721℃ 已收录 1评论

在上一篇文章中,使用CXF 处理了map类型。在这篇文章中将介绍web service 如何添加拦截器或者如何添加自定义拦截器。为什么要添加拦截器呢?主要是web service一旦暴露在外,任何人都能够调用该web service。所以添加拦截器增加权限控制必不可少。
在这篇文章中将在之前的项目基础上来介绍拦截器的使用和拦截器的机制:
当web service客户端发出soap 消息后,在<soap:header>中就能获取到客户端传进来的数据,然后web service 服务端接收到soap消息后。获取soap消息中客户端传过来的数据,将这些数据通过验证或者其他处理操作,来增加权限,下面我就以用户名和密码来做个简单例子,当用户名和密码不合法时,让客户端掉不能调用该web service。
在webservice 服务端项目中的发布类中加入如下代码:

package lee;

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

import javax.xml.ws.Endpoint;

import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.EndpointImpl;

import com.xm.cxf.ws.HelloWord;
import com.xm.cxf.ws.auth.AuthInterceptor;
import com.xm.cxf.ws.impl.HelloWorlWs;

/**
 * web service  发布类
 * @author zhaoxinmin
 */
public class ServiceMain {
	
	public static void main(String[] args) throws IOException {
	
		HelloWord hw=new HelloWorlWs();
		//发布web service
		EndpointImpl ep = (EndpointImpl) Endpoint.publish("http://192.168.1.77:8080/hello", hw);
		
		//添加 in拦截器   该拦截器AuthInterceptor检查用户名、密码是否正确
		ep.getInInterceptors().add(new AuthInterceptor());
		//添加 out拦截器 并且将日志输出到控制台中
		System.out.println("web service  发布成功!!!");
	}
}

建立一个拦截器类AuthInterceptor 让该类继承AbstractPhaseInterceptor 具体实现代码如下:

package com.xm.cxf.ws.auth;

import java.util.List;

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;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * 自定义拦截器        验证登陆
 * PhaseInterceptor  可以指定哪个阶段起作用
 * @author zhaoxinmin
 */
public class AuthInterceptor extends AbstractPhaseInterceptor {

	public AuthInterceptor() {
		super(Phase.PRE_INVOKE);   //该拦截器将会在拦截之前拦截soap消息
	}

	//在自定义拦截器中需要实现 handleMessage 方法
	//handleMessage   方法中的形参就是被拦截到的Soap 消息
	@Override
	public void handleMessage(SoapMessage msg) throws Fault {
		// TODO Auto-generated method stub
		System.out.println("--------------------------------"+msg);
		//从这里看出,已经拦截到了SOAP消息
		
		//得到SOAP消息的所有Header
		List
headers = msg.getHeaders(); //判断headers 是否为空 if(headers ==null || headers.size()<1){ throw new Fault(new IllegalArgumentException(“根本没有Header,别想调用!!!”)); } //加入第一个header 里面携带了用户名、密码信息 Header firstHeader = headers.get(0); Element e=(Element)firstHeader.getObject(); //根据标签名来得到子元素 NodeList userIds = e.getElementsByTagName(“userId”); NodeList userPasses = e.getElementsByTagName(“userPass”); if(userIds.getLength()!=1){ throw new Fault(new IllegalArgumentException(“用户名的格式不对!!!”)); } if(userPasses.getLength()!=1){ throw new Fault(new IllegalArgumentException(“用户密码的格式不对!!!”)); } //得到第一个元素 的文本内容 以该内容作为用户名 String userId = userIds.item(0).getTextContent(); //取得用户密码 String userPass= userPasses.item(0).getTextContent(); //实际项目中应该取查询数据库,该用户名、密码是否被授权访问我们的数据库 if(!userId.equals(“cxf”) || !userPass.equals(“xm”)){ throw new Fault(new IllegalArgumentException(“用户名或密码不正确!!!”)); } } }

运行web service 项目中的发布类(ServiceMain),显示效果如下:

image001
Web service 发布成功。此时,web service 服务器端自定义拦截器已经添加完毕。

本站文章如未注明,均为原创丨本网站采用BY-NC-SA协议进行授权,转载请注明转自:https://www.snowruin.com/?p=1547
喜欢 (3)or分享 (0)
发表我的评论
取消评论
表情 代码 贴图 加粗 链接 私信 删除线 签到

Hi,请填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(1)条精彩评论。
  1. 我看好你!
    可馨2015-11-30 11:36 回复| unknow| unknow