在web项目中不能使用ThreadLocal作为全局变量

由于项目需求变动,需要在接口里添加一个参数

比如原来method(String param1) 现在要变成method(String param1,String param2)

一般做法就是把原来的接口的方法全换掉,或者重载再写一个多一个参数的方法。

 

参数由controller 一直到service,由于改动比较多,就想到用ThreadLocal。

后来发现有一个没有参数的请求,也做了处理参数的操作,但是又不是每次都出现,

多请求几次就会出现一两次,感觉很奇怪:

url1:http://127.0.0.1/controller1?param=1

url2:http://127.0.0.1/controller2

 



 

 

controller1把request的参数放到threadLocal里,调用service,可以拿到param的值。

可是controller2有时也可以拿到param的值。

一点点排除发现不管是tomcat还是resin容器,都是线程池管理的,

比如controller1请求使用的thread1线程,在thread1放param的值,当请求完了后,thread1并没有销毁,

多次请求contoller2,controller2的线程可能会是thread1,这时还是有param的值的。所以也出现没有参数

的请求也在service处理了param。

找到问题后就修复:

有的人会建议在controller2中也加一个threadLocal.set(param)   [param的值为null]不就行了。这个方法本人感觉不好,可以使用spring的@Scope(value="request"),这个注解是对每一次request请求时

的参数做一个全局参数。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值