CXF - 拦截器

  1. 服务器端自定义拦截器
package org.shi.cxf;

import java.io.FileNotFoundException;
import java.io.PrintWriter;

import javax.xml.ws.Endpoint;

import org.apache.cxf.ext.logging.LoggingOutInterceptor;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.jaxws.EndpointImpl;
import org.shi.cxf.intecepter.AuthInteceptor;
import org.shi.cxf.ws.HelloWorld;
import org.shi.cxf.ws.QueryCatsByUser;
import org.shi.cxf.ws.impl.HelloWorldImpl;
import org.shi.cxf.ws.impl.QueryCatsByUserImpl;

/**
 * Web Service 服务器端  主启动类
 * @author xiaoshi
 *
 */
public class WSServiceStart {

	public static void main(String[] args) throws FileNotFoundException {
		//需要暴露的服务
		HelloWorld hw = new HelloWorldImpl();
		QueryCatsByUser queryCatsByUser = new QueryCatsByUserImpl();
		
		// 调用Endpoint 的 publish方法发布 Web Service 服务
		EndpointImpl ep =  (EndpointImpl) Endpoint.publish("http://127.0.0.1/shiWS", hw);
		
		//自定义拦截器用来来接用户名密码等的信息
		ep.getInInterceptors().add(new AuthInteceptor());
		
		System.out.println("web Service 发布成功!");
	}

}

 

拦截器的实现

package org.shi.cxf.intecepter;

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;

/**
 * 自定义拦截器实现用户名密码等的拦截
 * @author xiaoshi
 *
 */
public class AuthInteceptor extends AbstractPhaseInterceptor<SoapMessage>{

	public AuthInteceptor() {
		super(Phase.PRE_INVOKE);//该拦截器将会 在 “调用之前” 拦截SOAP 消息
	}

	@Override
	public void handleMessage(SoapMessage msg) throws Fault {
		System.out.println("------AuthInteceptor拦截到-----" + msg);
		
		List<Header> list =  msg.getHeaders();
		
		if(list == null || list.size()<1) {
			throw new Fault(new IllegalArgumentException("用户不合法,静止访问!"));
		}
		
		System.out.println(list.toString());
	}

}

 

然后用户访问的时候会被拦截到

 

   2 .客户端自定义拦截器

package org.shi.cxf;

import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.shi.cxf.interceptor.AddHeaderInterceptor;
import org.shi.cxf.ws.HelloWorld;
import org.shi.cxf.ws.impl.HelloWorldServiceName;

/**
 * web service 客户端  启动方法
 * @author xiaoshi
 *
 */
public class WSClientStart {

	public static void main(String[] args) {
		HelloWorldServiceName servieFactory = new HelloWorldServiceName();
		
		//此处返回的只是远程Web Service的代理;
		HelloWorld hw = servieFactory.getHelloWorldImplPort();
		
		//自定义拦截器实现请求拦截(就是out拦截)
		Client client = ClientProxy.getClient(hw);
		client.getOutInterceptors().add(new AddHeaderInterceptor("shiye","123"));//设置消息头
		client.getOutInterceptors().add(new LoggingOutInterceptor());//打印消息请求
		
		System.out.println(hw.sayHi("施爷"));
	}

}

 

package org.shi.cxf.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.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;

public class AddHeaderInterceptor extends AbstractPhaseInterceptor<SoapMessage>{

	private String userName;
	
	private String pwd;
	
	public AddHeaderInterceptor(String userName,String pwd) {
		super(Phase.PREPARE_SEND); //在准备发送时启用拦截器
		this.pwd = pwd;
		this.userName = userName;
	}

	@Override
	public void handleMessage(SoapMessage msg) throws Fault {
		List<Header> list = msg.getHeaders();
			
		//创建Document对象
		Document doc = DOMUtils.createDocument();
		Element element = doc.createElement("authHeader");
		
		//创建服务器端要求的参数类型格式
		Element idElement = doc.createElement("userName");
		idElement.setTextContent(userName);
		Element pwdElement = doc.createElement("pwd");
		pwdElement.setTextContent(pwd);
		
		element.appendChild(idElement);
		element.appendChild(pwdElement);
		
		Header header = new Header(new QName("auth"),element);
		list.add(header);//添加消息头
	}

}

 

 

 

转载于:https://my.oschina.net/u/3677987/blog/3027498

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值