java request 原理_Spring源码分析之RequestContextListener_weixin_39716703的博客-程序员秘密

技术标签: java request 原理  

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

来源:[]()

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39716703/article/details/114551705

智能推荐

最短路径问题 --- Dijkstra算法详解_离散数学dijkstra最短路径_KOwzb的博客-程序员秘密

最短路径问题最短路径问题 1、最短路径问题介绍 2、Dijkstra 算法思路 3、Dijkstra算法示例演示 4、Dijkstra算法的代码实现(c++) 参考最短路径问题1、最短路径问题介绍从图中的某个顶点出发到达另外一个顶点的所经过的边的权重和最小的一条路径,称为最短路径 1,给定一个带权有向图 G 与起始顶点 v,求从 v 到 G 中其...

在Pandas中如何给多层索引降级_flyfoxs的博客-程序员秘密

背景介绍通常我们不会在Pandas中主动设置多层索引,但是如果一个字段做多个不同的聚合运算, 比如sum, max这样形成的Column Level是有层次的,这样阅读非常方便,但是对编程定位比较麻烦.# 数据准备import pandas as pdimport numpy as npdf = pd.DataFrame(np.arange(0, 14).reshap...

Linux_strace_追踪进程使用到的系统调用_追踪进程的系统调用__虚竹的博客-程序员秘密

前言strace是个功能强大的Linux调试分析诊断工具,可用于跟踪程序执行时进程系统调用(system call)和所接收的信号,尤其是针对源码不可读或源码无法再编译的程序。在Linux系统中,用户进程不能直接访问计算机硬件设备。当进程需要访问硬件设备(如读取磁盘文件或接收网络数据等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace可跟踪进程产生的系统调用,包括参数、返回值和执行所消耗的时间。若strace没有任何输出,并不代表此时进程发生阻塞;也可能程序进...

计算机软件中地图数据分为,GIS考试复习题_泡泡桔子的博客-程序员秘密

D.高斯—克吕格投影采用6°分带法和3°分带法是为了控制投影的变形不至于过大,以保证地图的精度要求6、地理坐标系的坐标单位是:( A )A.角度单位B.长度单位C.弧度单位D.计量单位7、以下关于地图比例尺的描述正确的是:( A )A.地图比例尺可分为数字比例尺和图示比例尺两种B.图示比例尺的优势在于表现直观和计算方便C.比例尺精度在工程设计中的用途在于:可根据比例尺精度选择精度较高的比例尺地形图...

python编译器在cmd命令窗口中无法打开 python指令是外部命令 直接跳转应用商店_敲代码的小提琴手的博客-程序员秘密

特殊问题:在cmd命令窗口中输入python --version之后没有反应输入python之后 无法打开python编译器如下图所示解决方法:找到系统中的关掉这两个选项搞定~

大数据入门:各种大数据技术介绍_weixin_33965305的博客-程序员秘密

转自:http://www.aboutyun.com/thread-7569-1-1.html大数据我们都知道hadoop,可是还会各种各样的技术进入我们的视野:Spark,Storm,impala,让我们都反映不过来。为了能够更好的架构大数据项目,这里整理一下,供技术人员,项目经理,架构师选择合适的技术,了解大数据各种技术之间的关系,选择合适的语言。我们可以带着下面问题来阅读本文章:1.ha...

随便推点

[图形学]图形裁剪_Cohen-Sutherland算法_ZJU_fish1996的博客-程序员秘密

图形的裁剪算法就是判断图形是否在屏幕内,如果不在屏幕内就要将其裁剪再显示。它的基础就是直线的裁剪。        在Cohen-Sutherland算法中,我们将每条线段的端点编码为。                对于一个屏幕,将其四边延长,可将空间分为如下九个区域,落入每个区域的端点编码如下:                   对于一条线段,其两个端点的编码分

解决直接打开 vite +vue3 打包的 HTML 文件报错跨域 from origin ‘null‘ has been blocked by CORS policy_vue from origin 'null' has been blocked by cors po_粤小七的博客-程序员秘密

原因vite 是直接使用原生 ES6 模块打包的,然而 ES6 模块遵循同源策略,加上 script 本来就会跨域和 file 协议不支持跨域,所以不能直接通过 file 协议直接打开,除非使用 http(s) 等支持跨域的协议。解决办法1启动一个本地服务器,npm 安装 http-server 包,或着 VSCode 安装 Live Server 拓展等办法都可以。解决办法2暂时禁用浏览器的同源策略。............

Spring AOP 之 代理知识_二炮的博客-程序员秘密

本篇博客讲了静态代理,及JDK动态代理和CGLib动态代理。为某⼀个对象创建⼀个代理对象,程序不直接用原本的对象,而是由创建的代理对象来控制对原对象,通过代理类这中间一层,能有效控制对委托类对象的直接访问,也可以很好地隐藏和保护委托类对象,同时也为实施不同控制策略预留了空间。

PySimpleGUI 让 Python 的 GUI 界面开发变得如此简单(第01篇) —— 天气预报小功能实例分析_onesalatree的博客-程序员秘密

之前在学习 Python 的时候就很是苦恼如何用 python 来做界面开发,感觉好像 Python 在这方面是个短板,当时书上的使用的界面开发模块是 wxPython ,我当时看着书上密密麻麻的代码,就感觉头疼的厉害,瞬间感觉很是无力,直到有一天无意在一个公众号上看到了 PySimpleGUI 这个专门用来开发 GUI 界面的模块,而且完全基于 Python 语言,代码理解起来也很简单,但现在目...

核密度中对窗框h的估计用R语言_R语言代写的疾病制图中自适应核密度估计的阈值选择方法案例..._愍蟊朙的博客-程序员秘密

背景诸如核密度估计(KDE)的平滑方法被用于控制用于计算每种疾病率的空间支持的群体基础。平滑程度由用户定义的参数(带宽或阈值)控制,该参数影响疾病图的分辨率和计算的速率的可靠性。方法内核,带宽的大小,是影响在KDE [在地图上的平滑的程度的关键参数 ]。带宽可以是固定的也可以是可变的(自适应的)。对于固定带宽方法,内核具有固定大小的半径,并且所有内核(圆圈)具有相同的半径。在健康研究中,固定带宽方...

推荐文章

热门文章

相关标签