【CXF】- 拦截器 Interceptor

CXF拦截器

拦截动态操作请求和响应数据

拦截器分类

  • 位置:服务器端拦截器,客户端拦截器
  • 消息方向:入拦截器 出拦截器
  • 定义者:系统拦截器 自定义拦截器:LoggingInInteceptor

①:创建webservice服务端的自定义入拦截器,用于检查客户端传入的参数:

package com.zhiwei.ws.imp;

import java.util.List;
import org.apache.cxf.binding.soap.SoapHeader;
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 DefineInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
   	
	public DefineInterceptor() {
		super(Phase.PRE_PROTOCOL);	
	}
   
	//<head> <name>zhiwei<name></head>
	@Override
	public void handleMessage(SoapMessage msg) throws Fault {
		
		//获取文件头
		List<Header> headers=msg.getHeaders();
		SoapHeader header=(SoapHeader) headers.get(0);
	    Element element=(Element) header.getObject();
	    String name=element.getElementsByTagName("name").item(0).getTextContent();
	    
	    if("xiaoyang".equals(name)) {
	    	 System.out.println("Server interceptor.........."+name);	
	    	 return;
	    }
	   throw new Fault(new RuntimeException("用户名不正确!"));
	
	}
}

②:配置服务端的拦截器:引入CXF实现的日志记录拦截器,启动服务端

String address = "http://localhost:8888/webservice";

// 终端发布web服务:SEI实现类
Endpoint endpoint = Endpoint.publish(address, new HelloWSImp());

// 终端控制拦截器
EndpointImpl endpointImpl = (EndpointImpl) endpoint;

// 配置入拦截器:将拦截器加入到拦截器集合:日志拦截器
List<Interceptor<? extends Message>> inIterceptors = endpointImpl.getInInterceptors();
inIterceptors.add(new LoggingInInterceptor());
inIterceptors.add(new DefineInterceptor());

List<Interceptor<? extends Message>> outIterceptors = endpointImpl.getOutInterceptors();
outIterceptors.add(new LoggingOutInterceptor());

System.out.println("server is deploying!");

服务端控制台日志:

③:创建客户端自定义拦截器

package com.zhiwei.ws.client;

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;

@SuppressWarnings("deprecation")
public class DefineInterceptor extends AbstractPhaseInterceptor<SoapMessage> {

	private String name;

	public DefineInterceptor(String name) {
		super(Phase.PRE_PROTOCOL); // 准备协议时拦截
		this.name = name;
	}

	/*
	 * <Envelop> <head> <name>zhiwei<name> </head> <soapenv:Body> <q0:sayHello>
	 * <arg0>china</arg0> </q0:sayHello> </soapenv:Body> </Envelop>
	 */
	@Override
	public void handleMessage(SoapMessage msg) throws Fault {
		
		List<Header> headers=msg.getHeaders();  //获取soap的头信息
		 /* soap消息头:
		 * <head>
		 *    <zhiwei>
		 *        <name>zhiwei<name>
		 *    <zhiwei> 
		 *  </head>
		*/
		Document document=DOMHelper.createDocument();
		Element root=document.createElement("zhiwei");
		
		//Qname给标签添加一个独一无二的名字:类似别名
		Element element=document.createElement("name");
		element.setTextContent(name);
		
		root.appendChild(element);
		
		headers.add(new Header(new QName("root"), root));
		System.out.println("DefineInterceptor Interceptor:--------->running!");
	}
}

④:配置客户端拦截器,并且启动客户端

HelloWSImpService helloWSImpService=new HelloWSImpService();

HelloWS helloWS=helloWSImpService.getHelloWSImpPort();

//返回服务类的代理接口
Client client=ClientProxy.getClient(helloWS);  

List<Interceptor<? extends Message>> outIterceptors=client.getOutInterceptors();
outIterceptors.add(new DefineInterceptor("xiaoyang"));

String result=helloWS.sayHello("--->China!");
System.out.println(result);

客户端控制台日志:

服务端控制台日志:

分析:服务端日志明显可看出,webservice是根据soap协议进行通信,并且服务端客户端配置的 拦截器都实现了拦截功能

SOAP: 特殊形式的Http请求形式

转载于:https://my.oschina.net/yangzhiwei256/blog/3017165

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值