当前位置: 首页 > news >正文

玩转aop之cxf配置拦截器

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

一、客户端写法

1、配置


<jaxrs:outInterceptors>
			<bean
				class="com.xxx.base.interceptor.CxfOutMessageInterceptor"></bean>
		</jaxrs:outInterceptors>

2、CxfOutMessageInterceptor

cxf客户端将公共参数放在头信息里面传递到cxf的服务器端


import javax.ws.rs.core.MultivaluedMap;

import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.iflashbuy.base.common.CommonParams;
import com.iflashbuy.base.common.ContextThread;
import com.iflashbuy.base.util.ParamUtils;
import com.iflashbuy.base.util.StringUtil;
import com.iflashbuy.util.F2BUtil;

/**
 * cxf拦截器,在请求服务前生效<br>
 * 1、将公共参数通过header传到服务器端cxf
 * 
 * @author 漂泊者及其影子
 * @date 2016年1月13日
 */
public class CxfOutMessageInterceptor extends AbstractPhaseInterceptor<Message> {
	private Logger logger = LoggerFactory.getLogger(getClass());

	public CxfOutMessageInterceptor() {
		super(Phase.WRITE);
	}

	@Override
	public void handleMessage(Message message) throws Fault {
		String sysid = "";
		String key = "";
		CommonParams params = ContextThread.getCurrentParams();
		if (params != null) {
			sysid = params.getSysid();
			key = params.getKey();
		} else {
			sysid = ParamUtils.get("sysid");
			key = ParamUtils.get("key");
		}

		@SuppressWarnings("unchecked")
		MultivaluedMap<String, Object> headers = (MultivaluedMap<String, Object>) message.get(Message.PROTOCOL_HEADERS);
		headers.putSingle("sysid", sysid);
		headers.putSingle("key", key);

	}
	


}



二、cxf服务器端写法


1、配置

<jaxrs:inInterceptors>
			<bean class="com.xxx.base.util.CxfInMessageInterceptor"></bean>
		</jaxrs:inInterceptors>
       
       	<jaxrs:outInterceptors>
			<bean
				class="com.xxx.base.util.CxfOutMessageInterceptor"></bean>
		</jaxrs:outInterceptors>



2、CxfInMessageInterceptor

cxf服务器端在接受请求的时候从请求的头信息中获取公共参数

import java.util.List;
import java.util.TreeMap;

import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.iflashbuy.base.common.ContextThread;
import com.iflashbuy.base.constant.BaseConstant;

/**
 * cxf拦截器,在接受服务时候生效<br>
 * 1、获取从客户端传来的sysid<br>
 * 
 * @author 漂泊者及其影子
 * @date 2016年1月13日
 */
public class CxfInMessageInterceptor extends AbstractPhaseInterceptor<Message> {
	private Logger logger = LoggerFactory.getLogger(getClass());

	public CxfInMessageInterceptor() {
		super(Phase.RECEIVE);
	}

	@Override
	public void handleMessage(Message message) throws Fault {
		@SuppressWarnings("unchecked")
		TreeMap<String, Object> headers = (TreeMap<String, Object>) message.get(Message.PROTOCOL_HEADERS);
		String sysid = "";
		@SuppressWarnings("unchecked")
		List<String> sysidList = (List<String>) headers.get("sysid");
		if (CollectionUtil.isNotEmpty(sysidList)) {
			logger.info("sysid:" + sysidList.get(0));
			sysid = sysidList.get(0);
		}
		ContextThread.setCurrentSysid(sysid);
		log(message);
	}

	private void log(Message message) {
		if(BaseConstant.DEBUG_ENABLED) {
			String requestUri = (String) message.get(Message.REQUEST_URI);
			logger.info("requestUri:" + requestUri);
		}

	}
}



3、CxfOutMessageInterceptor

出于保险考虑,在cxf服务器端的请求完成后将ThreadLocal里面的对象销毁

import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import com.iflashbuy.base.common.ContextThread;

/**
 * cxf服务器端拦截器,在请求完成后生效<br>
 *
 * 
 * @author 漂泊者及其影子
 * @date 2016年1月13日
 */
public class CxfOutMessageInterceptor extends AbstractPhaseInterceptor<Message> {
	public CxfOutMessageInterceptor() {
		super(Phase.WRITE);
	}

	@Override
	public void handleMessage(Message message) throws Fault {
		// 在请求完成后销毁contextThread里面的内容
		ContextThread.setCurrentSysid(null);
	}

}



三、ContextThread

cxf服务器端将公共参数放在ThreadLocal里面,以便cxf服务器端具体的业务方法能够拿到这些公共参数

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 
 * @author limanman
 * @date 2015年11月24日
 */
public class ContextThread {
	/**
	 * ThreadLocal确保高并发下每个请求的request,response都是独立的
	 */
	private static ThreadLocal<HttpServletRequest> currentRequest = new ThreadLocal<HttpServletRequest>();
	private static ThreadLocal<HttpServletResponse> currentResponse = new ThreadLocal<HttpServletResponse>();
	private static ThreadLocal<CommonParams> currentParams = new ThreadLocal<CommonParams>();
	private static ThreadLocal<String> threadSessionKey = new ThreadLocal<String>();
	
	/**
	 * 用于sgint_service,进在cxf接受请求的时候将sysid设入
	 */
	private static ThreadLocal<String> currentSysid = new ThreadLocal<String>();
	
	
	public static String getCurrentSysid() {
		return currentSysid.get();
	}

	public static void setCurrentSysid(String sysid) {
		ContextThread.currentSysid.set(sysid);
	}

	public static CommonParams getCurrentParams() {
		return currentParams.get();
	}

	public static void setCurrentParams(CommonParams currentParams) {
		ContextThread.currentParams.set(currentParams);
	}

	public static HttpServletRequest getCurrentRequest() {
		return currentRequest.get();
	}

	public static void setCurrentRequest(HttpServletRequest currentRequest) {
		ContextThread.currentRequest.set(currentRequest);
	}

	public static HttpServletResponse getCurrentResponse() {
		return currentResponse.get();
	}

	public static void setCurrentResponse(HttpServletResponse currentResponse) {
		ContextThread.currentResponse.set(currentResponse);
	}

	public static String getThreadSessionKey() {
		return threadSessionKey.get();
	}

	public static void setThreadSessionKey(String sessionKey) {
		threadSessionKey.set(sessionKey);
	}
}


四、cxf配置了拦截器的好处总结


  1. 权限验证,有些请求可能涉及到权限这一块
  2. 公共参数传递,避免在每个方法中都要在参数总加入一些公共参数,公共参数可以在拦截器中通过头部信息来传递
  3. 日志打印,打印相关请求信息(测试阶段)


转载于:https://my.oschina.net/fengshuzi/blog/601961

相关文章:

  • java网站建设流程
  • css处理浏览器兼容问题
  • 如何在Ubuntu上配置scala教程
  • BZOJ 2176 Strange String (最小表示法)
  • 提示框UIAlertView/UIAlertViewController的简单使用
  • jsp的EL表达式
  • Spring MVC MultipartFile实现图片上传
  • 二分查找待更新
  • git管理
  • 高级特性(10)- 脚本、编译与注解处理
  • OSChina 周一乱弹 —— 深圳下冰雹了
  • 使用拦截器实现权限管理
  • 没人研究tokumx吗?作为mongodb的追求者,来说两句。
  • storm acker机制
  • 4Sum -- LeetCode
  • [NodeJS] 关于Buffer
  • ComponentOne 2017 V2版本正式发布
  • create-react-app做的留言板
  • css系列之关于字体的事
  • Docker入门(二) - Dockerfile
  • Github访问慢解决办法
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • java取消线程实例
  • Java知识点总结(JavaIO-打印流)
  • Laravel核心解读--Facades
  • Linux CTF 逆向入门
  • Otto开发初探——微服务依赖管理新利器
  • Rancher-k8s加速安装文档
  • Service Worker
  • sessionStorage和localStorage
  • SpiderData 2019年2月25日 DApp数据排行榜
  • 爱情 北京女病人
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 微信小程序开发问题汇总
  • ​插件化DPI在商用WIFI中的价值
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • ###STL(标准模板库)
  • #pragma data_seg 共享数据区(转)
  • (¥1011)-(一千零一拾一元整)输出
  • (70min)字节暑假实习二面(已挂)
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (MATLAB)第五章-矩阵运算
  • (poj1.3.2)1791(构造法模拟)
  • (安卓)跳转应用市场APP详情页的方式
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (五)c52学习之旅-静态数码管
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .NET Core引入性能分析引导优化
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)