RequestHolder中定义requestHolder疑问?
来源:8-11 ThreadLocal,LoginFilter实现登录请求的拦截

慕仰2531408
2018-10-15
老师请教下,我理解ThreadLocal这个线程变量是去封装spring容器中有状态的bean的非共享变量,以保证并发时,线程都能拿到同一份成员属性。
你的处理,我理解就是给当前的线程创建个全局的变量,user信息不存在session可以理解,但是一次http请求,都会启一个线程,Servlet容器都会创建HttpRequest,编码时都能取到,不存在你说的需要传输(即使传输也是容器在处理),而且你也只在requestHolder取ip,而后面拦截器 Jsp里用的还是原始的httpRequest,请问requestHolder定义是否多余了?理解有误的地方,烦请老师指出,谢谢
写回答
1回答
-
Jimin
2018-10-15
你好,你应该是没完全理解他的好处,他确实相当于是给每个线程定义个全局变量,利用线程封闭保证并发时的线程安全。这里这样设计,是不需要把request及user等一直在方法间传输,课程里演示的代码层级属于比较简单的,复杂一点的相信你也见过,可能会有好几层甚至十几层、几十层,通过这个holder,就可以不用在每个方法定义时带上request和user这个参数,而且是随时想用随时就可以拿出来用。
通过这个holder,既能保证线程安全,又可以保证方法定义简单,任何一个方法想使用这个关键变量,都不再需要把他的调用层级上都加上这个参数,相比常规的需要增加一个核心参数就在方法定义上增加一个要好很多,不至于出错,也不用担心会不会某一层拿不到给了个null112020-04-06
相似问题