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

相关推荐