java request 原理_Spring源码分析之RequestContextListener

1.原理分析:

RequestContextListener用于监听用户的请求,当一个用户发送一个请求,会将用户的请求request对象保存在RequestContextHolder中的requestAttributesHolder本地线程池中,当用户的请求执行完毕,会清除RequestContextHolder中的requestAttributesHolder本地线程池中的request对象

2.应用场景:

①在web.xml中配置RequestContextListener监听器

②在代码中的任何地方,比如controller、service等中可以通过如下方式获取request对象

public static HttpServletRequest getRequest() {

ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();

HttpServletRequest request = servletRequestAttributes.getRequest();

return request;

}

3.源码分析: RequestContextListener类

943e5daaba3ee52d6453e036bae6003f.png

用户发送请求会执行requestInitialized方法,然后通过如上图箭头标记的地方设置ServletRequestAttributes,然后点击setRequestAttributes方法我们得到如下图

6782dcadfa0f79d5690753a373613684.png

点击方法进入如下图

d94223596bbcf6263b16827ac1908554.png

执行如上图标记的地方,继续点击进去

41a9598308fb3c469a99c81d1cb1e614.png

如上图我们可以看到,该方法会获取当前请求的线程,当前请求的线程Thread对象中包含一个ThreadLocalMap,如果当前线程的ThreadLocalMap为null,则创建一个,会将RequestContextHolder中的requestAttributesHolder对象作为key,ServletRequestAttributes对象作为value。

这样我们通过RequestContextHolder中的getRequestAttributes方法获取request对象

6e6dfeedb3d0e8a902352c8c4e831e8b.png

之后附上SevletRequestListener被注册的地方

1.Spring项目中我们需要在web.xml中配置RequestContextListener监听器来监听用户的请求

2.Spring boot项目我们可以直接使用,原因如下图,已经帮助我们自动注册了改监听器

36f25c5136e445ecdc44ff1b40da6369.png

来源:[]()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值