Spring MVC LocaleContextHolder在服务层中是否安全

xyhw6mcr  于 2022-11-15  发布在  Spring
关注(0)|答案(1)|浏览(125)

根据官方文档,LocaleContextHolder是:
将LocaleContext示例与当前线程关联的简单保持器类。
因此它被绑定到当前thread,但这是在谈论Thread线程还是当前请求的线程。
如果这是一个愚蠢的问题,请道歉,我不确定LocaleContextHolder是否绑定到HTTP会话或其他东西,以便在任何服务层类中使用它都是安全的。

jckbn6z7

jckbn6z71#

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

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

您可以了解ThreadLocal是什么,但为了方便起见,请将其视为一种数据结构,它将当前执行线程的IDMap到其泛型类型的对象,这里是LocaleContext
Servlet容器有一个线程池,用来处理客户端请求。当请求到来时,它会提取其中一个线程,并执行servlet的service()方法。在Spring中,这会导致DispatcherServlet执行,并调用@Controller的handler方法。这一切都发生在servlet容器选择的原始Thread中。
所以当你的@Service类的方法被调用时,你仍然在同一个线程中。
LocaleContextHolder中的ThreadLocalFrameworkServlet中请求处理早期某个点的set()(它是DispatcherServlet的父类型)方法initContextHolders(),该方法由processRequest()doGet()doPost()Locale是通过HttpServletRequest及其getLocale()方法构建的。

相关问题