为webservice上加身份验证

         在前面的基础上加上身份验证。

         只需在服务端与客户端的调用之前后知添加拦截器即可:

        服务端:

        

package com.webservice.cxf.test;

import javax.xml.ws.Endpoint;

import org.apache.cxf.jaxws.EndpointImpl;

import com.webservice.cxf.auth.AuthInterceptor;
import com.webservice.cxf.impl.HelloWorldImpl;

public class TestMain
{

	public static void main(String[] args)
	{
		HelloWorldImpl helloWorldImpl = new HelloWorldImpl();
		EndpointImpl ep = (EndpointImpl) Endpoint.publish(
				"http://127.0.0.1/richard", helloWorldImpl);

		// 给服务器添加In拦截器,拦截从客户端来的信息。
		ep.getInInterceptors().add(new AuthInterceptor());
		// 给服务器添加Out拦截器,拦截从服务器端出去的信息。
		//ep.getOutInterceptors().add(new LoggingOutInterceptor());
		System.out.println("暴漏成功");
	}
}
    自定义In拦截器:

package com.webservice.cxf.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.NodeList;


/**
 * In拦截器
 * @author xushuai
 *
 */
public class AuthInterceptor extends AbstractPhaseInterceptor<SoapMessage>
{
	public AuthInterceptor()
	{
		//显示调用父类的构造器,在发送消息之前调用,in拦截器
		super(Phase.PRE_INVOKE);
	}


	@Override
	public void handleMessage(SoapMessage msg) throws Fault
	{
		// 得到soap消息的所有header消息
		List<Header> headers = msg.getHeaders();
		if (headers.size() < 1 || headers.isEmpty())
		{
			throw new Fault(new IllegalArgumentException("没有header"));
		}


		// 获取第一个header并得到header信息
		Header firstheader = headers.get(0);
		Element ele = (Element) firstheader.getObject();


		// 得到userId的节点
		NodeList nodeIds = ele.getElementsByTagName("userId");
		NodeList nodePasses = ele.getElementsByTagName("userPass");


		// 检查各节点是否为空
		if (nodeIds.getLength() != 1)
		{
			throw new Fault(new IllegalArgumentException("用户名格式不正确"));
		}
		if (nodePasses.getLength() != 1)
		{
			throw new Fault(new IllegalArgumentException("密码格式不正确"));
		}


		// 从数据库中获取user和密码是否被授权查询信息
		String user = nodeIds.item(0).getTextContent();
		String pwd = nodePasses.item(0).getTextContent();


		if (!user.equals("Richard"))
		{
			throw new Fault(new IllegalArgumentException("用户名不正确"));
		}
		if (!pwd.equals("123"))
		{
			throw new Fault(new IllegalArgumentException("密码不正确"));
		}
	}


}

客户端:Out拦截器

package com.webservice.cxf.test;

import java.util.List;

import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;

import com.webservice.cxf.Cat;
import com.webservice.cxf.Entity;
import com.webservice.cxf.IHelloWorld;
import com.webservice.cxf.StringCat;
import com.webservice.cxf.User;
import com.webservice.cxf.impl.HelloWorldImpl;

public class ClientTestmain
{

	public static void main(String[] args)
	{
		HelloWorldImpl factory = new HelloWorldImpl();
		IHelloWorld hw = factory.getHelloWorldImplPort();

		// 为客户端添加out拦截器
		Client clientProxy = ClientProxy.getClient(hw);
		//为out拦截器添加自定义拦截器
		clientProxy.getOutInterceptors().add(new AddHeaderInterceptor("Richard", "123"));

		System.out.println(hw.sayHi("xushuai"));

		User user = new User();
		user.setId(1);
		user.setName("Richard");
		user.setPass("1234");
		List<Cat> catList = hw.getCatsByUser(user);
		for (Cat cat : catList)
		{
			System.out.println(cat.getCat());
		}

		StringCat stringCat = hw.getAllCats();
		List<Entity> ens = stringCat.getEntities();
		for (int i = 0; i < ens.size(); i++)
		{

			System.out.println(ens.get(i).getKey() + " | "
					+ ens.get(i).getValue().getCat());
		}
	}
}

客户端的自定义拦截器,在其的Header中添加身份信息

package com.webservice.cxf.test;

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.helpers.DOMUtils;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

/**
 * soap消息分两部分,第一部分Header中携带身份等信息,第二部分body里面携带具体的操作信息
 * AbstractPhaseInterceptor<SoapMessage>中的SoapMessage就是操作其Header信息,
 * 在Header中添加身份信息。
 * @author xushuai
 *    Out拦截器
 */
public class AddHeaderInterceptor extends AbstractPhaseInterceptor<SoapMessage>
{

	private String userId;
	private String pwd;

	public AddHeaderInterceptor(String userid, String pwd)
	{
		// 准备发送消息的时候启用该拦截器
		super(Phase.PREPARE_SEND);
		this.pwd = pwd;
		this.userId = userid;
	}

	@Override
	public void handleMessage(SoapMessage mgs) throws Fault
	{
		List<Header> headers = mgs.getHeaders();
		
		Document doc = DOMUtils.createDocument();
		//自定义一个XML片段添加在Header中,并在服务器端查询是否有该片段。
		//达到身份拦截的目的。
		/**
		 * <authElement>
		 *    <userId></userId>
		 *    <userPass></userPass>
		 * </authElement>
		 */
		Element ele = doc.createElement("authElement");
		Element useridEle = doc.createElement("userId");
		useridEle.setTextContent(userId);
		Element pwdEle = doc.createElement("userPass");
		pwdEle.setTextContent(pwd);
		
		ele.appendChild(useridEle);
		ele.appendChild(pwdEle);
		
		headers.add(new Header(new QName("web"),ele));
	}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值