在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请求时
的参数做一个全局参数。