webservice 自定义拦截器实现安全认证

webservice 自定义拦截器实现安全认证


服务器端验证拦截器:

package com.mscncn.ws.sayhi.interceptor;

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;

public class CheckUserInterceptor extends AbstractPhaseInterceptor<SoapMessage> {

	public CheckUserInterceptor() {
		super(Phase.PRE_PROTOCOL);
	}

	public void handleMessage(SoapMessage msg) throws Fault {
		Header header=msg.getHeader(new QName("mscncn"));
		if(header!=null){
			Element rootEle=(Element) header.getObject();
			String name=rootEle.getElementsByTagName("name").item(0).getTextContent();
			String password=rootEle.getElementsByTagName("password").item(0).getTextContent();
			if(name.equals("zs")&&password.equals("123456")){
				System.out.println(" Service 通过了拦截器");
			}
		}
		//没有通过
		System.out.println("Service 没有通过拦截器");
	}

}

服务器端注册拦截器:

public static void main(String[] args) {
		String address="http://192.168.70.51:1111/day01_ws/hellows";
		Endpoint point=Endpoint.publish(address, new HelloWSImpl());
		EndpointImpl endpointImpl=(EndpointImpl)point;
		List<Interceptor<? extends Message>> inTerceptors=endpointImpl.getInInterceptors();
		inTerceptors.add(new CheckUserInterceptor());
		System.out.println("web service 发布成功!");
	}

客户端拦截器:

package com.mscncn.ws.sayhi.interceptor;

import java.util.List;

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.apache.xml.utils.DOMHelper;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class AddUserInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
	private String name;
	private String password;
	/**
	 * @param phase  拦截器什么时候被调用
	 */
	public AddUserInterceptor() {
		super(Phase.PRE_PROTOCOL);//准备协议化时拦截
	}
	public AddUserInterceptor(String name,String password){
		super(Phase.PRE_PROTOCOL);//准备协议化时拦截
		this.name=name;
		this.password=password;
	}

	@Override
	public void handleMessage(SoapMessage msg) throws Fault {
		/*
		 <Envelope>
		 	<head>
		 		<mscncn>
		 			<name></name>
		 			<password></password>
		 		</mscncn>
		 	</head>
		 	<!--请求体-->
		 	<body>
		 		<!--方法名-->
		 		<sayHello>
		 			<!--方法参数-->
		 			<arg0>tom</arg0>
		 		</sayHello>
		 	</body>
		 </Envelope>
		 */
		List<Header> headers=msg.getHeaders();//获取所有的头
		Document document=DOMHelper.createDocument();
		Element rootEle=document.createElement("mscncn");
		Element nameEle=document.createElement("name");
		Element passwordEle=document.createElement("name");
		nameEle.setTextContent(name);
		passwordEle.setTextContent(password);
		rootEle.appendChild(nameEle);
		rootEle.appendChild(passwordEle);
		headers.add(new Header(new QName("mscncn"), rootEle));
		System.out.println("client handleMessage()......");
	}
	
}


客户端注册拦截器:

public static void main(String[] args) {
		HelloWSImplService wsImplService=new HelloWSImplService();
		HelloWS ws=wsImplService.getHelloWSImplPort();
		Client client=ClientProxy.getClient(ws);
		List<Interceptor<? extends Message>> outTerceptors=client.getInInterceptors();
		outTerceptors.add(new AddUserInterceptor("zs","123456"));
		System.out.println("client :"+ws.sayHello("tom cat"));
	}
}

   CXF中的拦截器分为in拦截器和out拦截器,又有客户端拦截器和服务端拦截器。

拦截器使用流程:客户端(out)-> 服务端(in)->处理业务->服务端(out)->客户端(in),并不是每一步都需要拦截器。在这里我们用到的是客户端Out拦截器和服务端in拦截器。服务端in拦截器检查用户级权限,客户端out浏览器发送用户信息给服务端。


转载于:https://my.oschina.net/KingPan/blog/317866

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值