区域设置
Spring 大部分架构都支持国际化,Spring Web MVC 框架也不例外。DispatcherServlet
允许你通过使用客户端的区域设置自动解析消息。这是通过 LocaleResolver
对象完成的。当请求到来时,DispatcherServlet
会查找一个区域设置解析器,如果找到,它会尝试使用它来设置区域设置。通过使用 RequestContext.getLocale()
方法,你总是可以检索到由区域设置解析器解析的区域设置。除了自动区域设置解析之外,你还可以将一个拦截器附加到处理程序映射(有关处理程序映射拦截器的更多信息,请参阅 拦截)以在特定情况下更改区域设置(例如,基于请求中的参数)。区域设置解析器和拦截器定义在 org.springframework.web.servlet.i18n
包中,并以常规方式在你的应用程序上下文中配置。Spring 中包含了以下区域设置解析器。
时区
除了获取客户端的区域设置之外,了解其时区也通常很有用。LocaleContextResolver
接口提供了 LocaleResolver
的一个扩展,允许解析器提供更丰富的 LocaleContext
,其中可能包含时区信息。
如果可用,可以使用 RequestContext.getTimeZone()
方法获取用户的 TimeZone
。时区信息由任何注册到 Spring ConversionService
的日期/时间 Converter
和 Formatter
对象自动使用。
Header 解析器
此区域设置解析器检查客户端(例如,Web 浏览器)发送的请求中的 accept-language
头。通常,此头字段包含客户端操作系统的区域设置。请注意,此解析器不支持时区信息。
Cookie 解析器
此区域设置解析器检查客户端上可能存在的 Cookie
,以查看是否指定了 Locale
或 TimeZone
。如果指定了,它将使用指定的详细信息。通过使用此区域设置解析器的属性,你可以指定 cookie 的名称以及最大年龄。以下示例定义了一个 CookieLocaleResolver
:
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
<property name="cookieName" value="clientlanguage"/>
<!-- in seconds. If set to -1, the cookie is not persisted (deleted when browser shuts down) -->
<property name="cookieMaxAge" value="100000"/>
</bean>
下表描述了 CookieLocaleResolver
的属性:
属性 | 默认值 | 描述 |
---|---|---|
|
类名 + LOCALE |
Cookie 的名称 |
|
Servlet 容器默认 |
Cookie 在客户端上持久化的最长时间。如果指定 |
|
/ |
将 cookie 的可见性限制到你网站的某个部分。当指定 |
Session 解析器
SessionLocaleResolver
允许你从可能与用户请求关联的会话中检索 Locale
和 TimeZone
。与 CookieLocaleResolver
不同,此策略将本地选择的区域设置存储在 Servlet 容器的 HttpSession
中。因此,这些设置对每个会话都是临时的,并在每个会话结束时丢失。
请注意,这与外部会话管理机制(例如 Spring Session 项目)没有直接关系。SessionLocaleResolver
根据当前的 HttpServletRequest
评估和修改相应的 HttpSession
属性。
区域设置拦截器
你可以通过将 LocaleChangeInterceptor
添加到 HandlerMapping
定义之一来启用区域设置更改。它检测请求中的参数并相应地更改区域设置,调用调度程序应用程序上下文中 LocaleResolver
上的 setLocale
方法。下一个示例显示,对所有包含名为 siteLanguage
参数的 *.view
资源的调用现在会更改区域设置。因此,例如,对 URL https://www.sf.net/home.view?siteLanguage=nl
的请求会将网站语言更改为荷兰语。以下示例显示了如何拦截区域设置:
<bean id="localeChangeInterceptor"
class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="siteLanguage"/>
</bean>
<bean id="localeResolver"
class="org.springframework.web.servlet.i18n.CookieLocaleResolver"/>
<bean id="urlMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="localeChangeInterceptor"/>
</list>
</property>
<property name="mappings">
<value>/**/*.view=someController</value>
</property>
</bean>