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");
那么就有两个问题:
- request和response怎么和当前请求挂钩?
- 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方法,拿到该线

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

被折叠的 条评论
为什么被折叠?



