如何从Spring获取当前用户区域设置而不将其作为参数传递给函数?

时间:2012-05-29 02:52:11

标签: spring spring-mvc

我正在使用Spring 3.1并希望找到当前用户活动的语言环境有没有办法直接获取语言环境而不必强制将其从控制器传递到服务层......等等。

spring会将locale存储在一个线程本地存储中,可以通过调用一些静态方法来获取它吗?

3 个答案:

答案 0 :(得分:128)

我也在寻找如何在不传递Locale的情况下访问语言环境,但我仍然是Spring的新手,并发现大多数解决方案都令人困惑。但事实证明,Spring MVC确实将语言环境存储在线程本地存储中。它可以通过以下方式访问:

Locale locale = LocaleContextHolder.getLocale();
  

最后一种方法[...]基于本地线程,以便在您的架构的任何实体中提供当前区域设置。 [...]您必须知道LocaleContextHolder的内容默认对应于Web请求中指定的语言环境。

来自:Configuring locale switching with Spring MVC 3。 (该帖子还提供了获取语言环境的替代配置/方法,这对于任何想要这样做的人都有用)。

您还可以查看Spring here中的LocaleContextHolder文档。

答案 1 :(得分:3)

这取决于您在会话或cookie中配置存储区域设置的位置?

在我的应用程序中,我已配置为使用下面提到的配置将用户区域设置存储在其会话中。

    <mvc:interceptors>
        <ref bean="localeChangeInterceptor"/>
    </mvc:interceptors>

    <bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
        <property name="paramName" value="lang"/>
    </bean>

    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
        <property name="defaultLocale" value="en"/>
    </bean>

    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basenames">
        <list>
            <value>/WEB-INF/i18n/labels</value>
            <value>/WEB-INF/i18n/messages</value>
            <value>/WEB-INF/i18n/include</value>
        </list>
        </property>
        <property name="defaultEncoding" value="UTF-8"/>
    </bean>

如果您已经完成了这样的事情,那么您可以轻松地从会话中检索语言环境参数。

希望这会对你有所帮助。

干杯。

答案 2 :(得分:2)

我们有同样的需求,因此想出Locale进入ThreadLocal上下文。我们已经在ThreadLocal上下文中存储了一个对象(一些用户信息),所以只需附加它(看起来像黑客,但我们找到的最快的解决方案)。