RequestContextHolder

作用

  1. 持有上下文的Request容器
  2. 通过静态方法可以获取当前的Request请求

实现原理

在进行ServletRequest请求的时候,触发ServletRequestListener监听事件的子类RequestContextListener监听事件,调用requestInitialized()方法进行初始化的时候,将当前请求的相关信息放入一个ThreadLocal当中
ThreadLocal是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不同的变量值完成操作的场景。
在每个线程的内部存在一个数据结构为Map的ThreadLocals变量,以<ThreadLocal,Value>的形式保存着线程变量和其对应的值。
对于不同的线程,每次获取副本值时,别的线程并不能获取到当前线程的副本值,形成了副本的隔离,互不干扰。

使用

// 补充
RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();

// 获取请求体 request
HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();

// 获取响应体 response
HttpServletResponse response = ((ServletRequestAttributes) requestAttributes).getResponse();

// 获取请求头 headers
Enumeration<String> headerNames = request.getHeaderNames();
// 根据请求体参数从 request 中获取 header 请求头值
Map<String, String> headers = new HashMap<>();
if (headerNames.hasMoreElements()) {
    String name = headerNames.nextElement();
    headers.put(name, request.getHeader(name));
}

使用案例:获取当前用户

	private static NativeWebRequest getWebRequest() {
		RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
		if (requestAttributes instanceof ServletRequestAttributes) {
			ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes;
			return new ServletWebRequest(servletRequestAttributes.getRequest());
		}
		return null;
	}

	public static CurrentUser getCurrentUser() {
		NativeWebRequest webRequest = getWebRequest();
		if (webRequest != null) {
			String detailJsonText = webRequest.getHeader(ClassroomConstant.CONTEXT_KEY_USER);
			if (StringUtil.isNotEmpty(detailJsonText)) {
				detailJsonText = new String(detailJsonText.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
				CurrentUser currentUser = JsonMapper.getInstance().fromJson(detailJsonText, CurrentUser.class);
				if (Objects.nonNull(currentUser)) {
					return currentUser;
				} else {
					throw new BizException(ResultCode.INVALID_USER);
				}
			}
		}
		throw new BizException(ResultCode.INVALID_USER);
	}

参考链接:https://blog.csdn.net/Ep_Little_prince/article/details/119455704

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值