Springmvc中在controller注入request会有线程安全问题吗
Springmvc中在controller注入request会有线程安全问题吗
@Controller public class AController{ @Autowire HttpServletRequest request; @RequestMapping("/test") public Result test(){ System.out.println(request.toString()); request.getHeader("uid"); } }
1.通过@Autowire注入的HttpServletRequest只是一个“空壳”,真正的对象是在被访问到的时候才会从线程中取得的。
2.注入的request对象是HttpServletRequest类的一个实例,重复多次http请求,发现这个对象的id始终不变
3.但当我们获取设置里面的值时,会通过一个拦截器SpringExtUtil获取得到当前线程关联的”ServletRequestAttributes“对象,而获取到的。
4.所以这个是不会因为不同请求改变里面的值面引起线程安全问题的。
5.可以理解为每个请求的HttpServletRequest都是一个与线程关联的实例化。
参考原文:https://my.oschina.net/sluggarddd/blog/678603?fromerr=XhvpvVTi
参考原文:http://www.th7.cn/Program/java/201503/420240.shtml
我们观察request.getParameter(xxx)执行时的,线程堆栈情况,如下,在执行getParameter(xxx)首先碰到了一个拦截器SpringExtUtil$ProxiedInterceptor,这里拦截器通过com.alibaba.citrus.service.requestcontext.impl.RequestContextBeanFactoryPostProcessor$RequestProxyTargetFactory.getObject()获取到真正的request对象。
publicStringother(Localelocale,Principalprincipal)
java.util.Locale:得到当前请求的本地化信息,默认等价于ServletRequest.getLocale(),如果配置LocaleResolver解析器则由它决定Locale,后续介绍;
java.security.Principal:该主体对象包含了验证通过的用户信息,等价于HttpServletRequest.getUserPrincipal()。
这些都是springMVC实现的,自定义的参数要使用request的get参数方法才能得到
http://jinnianshilongnian.iteye.com/blog/1698916