RequestContextHolder分析

RequestContextHolder是一个用于获取当前请求的request和response的对象,通过ThreadLocal存储请求上下文。当在多个地方需要同一请求对象时,避免参数传递,可以使用它。在Servlet的生命周期中,如FrameworkServlet的doGet或doPost方法中,请求和响应会被设置进RequestContextHolder。设置过程涉及initContextHolders方法,通过RequestContextHolder.setRequestAttributes方法将请求属性存入ThreadLocal变量。

RequestContextHolder使用

1.1 RequestContextHolder使用

RequestContextHolder:持有上下文的Request容器,通过RequestContextHolder的静态方法可以随时随地取到当前请求的request对象

场景: 什么情况下需要用呢,当你全局各个地方都需要request这个属性,每个地方获取的还得是这同一个条请求,但你又不想把他当做参数一层一层的传递,那就需要一个请求的全局上下文。

具体使用方法如下:

// 获取相关对象
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
//可以强转成ServletRequestAttributes
HttpServletRequest request = ((ServletRequestAttributes)requestAttributes).getRequest();
HttpServletResponse response = ((ServletRequestAttributes)requestAttributes).getResponse();
 String token = request.getHeader("token");

那么就有两个问题:

  1. request和response怎么和当前请求挂钩?
  2. request和response等是什么时候设置进去的?

1.2 问题

1.2.1 request和response怎么和当前请求挂钩?

其原理是通过ThreadLocal保存当前线程下的request(其实所有ContextHolder上下文的实现原理基本都是利用ThreadLocal)。

该类主要维护了两个全局容器(基于ThreadLocal):

//得到存储进去的request
private static final ThreadLocal<RequestAttributes> requestAttributesHolder = 
    new NamedThreadLocal<RequestAttributes>("Request attributes");
// 和上面比较,它是被子线程继承的request   Inheritable:可继承的
private static final ThreadLocal<RequestAttributes> inheritableRequestAttributesHolder =
            new NamedInheritableThreadLocal<RequestAttributes>("Request context");

在获取的时候,调用上述两个ThreadLocal的get方法,拿到该线

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猪大侠0.0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值