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

ams*_*ams 57 spring spring-mvc

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

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

小智 135

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

Locale locale = LocaleContextHolder.getLocale();
Run Code Online (Sandbox Code Playgroud)

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

From:使用Spring MVC 3配置区域设置切换.(该帖子还提供了获取语言环境的替代配置/方法,这对于任何想要这样做的人都有用).

您还可以在此处查看LocaleContextHolderSpring 的文档.


Jap*_*edi 5

这取决于您配置存储区域设置的位置,在会话中还是在 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>
Run Code Online (Sandbox Code Playgroud)

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

希望这对你有帮助。

干杯。