LocaleContextHolder在服务层是否安全

时间:2013-09-05 19:02:27

标签: java spring spring-mvc

根据官方文档,LocaleContextHolder是:

  

简单的持有者类,它将LocaleContext实例与当前线程相关联。

因此它与当前thread相关联,但这是关于Thread线程还是当前请求的线程。

道歉,如果这是一个愚蠢的问题,我不是一个LocaleContextHolder没有绑定到HTTP会话或其他东西,以便在任何服务层类中使用是安全的。

1 个答案:

答案 0 :(得分:13)

如果您查看LocaleContextHolder的源代码,您会发现它有一个ThreadLocal变量(实际上有两个)

private static final ThreadLocal<LocaleContext> localeContextHolder =
        new NamedThreadLocal<LocaleContext>("Locale context");

您可以阅读ThreadLocal是什么,但为了我们的目的,请将其视为一种数据结构,将当前正在执行的线程的ID映射到其泛型类型的对象LocaleContext。< / p>

Servlet容器有一个用于处理客户端请求的线程池。当请求进入时,它将提取其中一个线程并执行您的servlet的service()方法。使用Spring,这会导致执行DispatcherServlet并调用@Controller的处理程序方法。这一切都发生在servlet容器选择的原始Thread中。

因此,当你的@Service类'方法被调用时,你仍然在同一个线程中。

ThreadLocal中的LocaleContextHolder在请求处理的早期某个时间set() FrameworkServletDispatcherServlet的父类型) initContextHolders()在每个processRequest()doGet()等方法中调用了doPost()Locale是根据HttpServletRequest及其getLocale()方法构建的。