地区
Spring 架构的大部分部分都支持国际化,Spring web MVC 框架也是如此。 DispatcherServlet
允许您通过使用客户端的区域设置自动解析消息。这是通过 LocaleResolver
对象完成的。
当请求到达时,DispatcherServlet
会查找一个区域解析器,如果找到一个,它会尝试使用它来设置区域。通过使用 RequestContext.getLocale()
方法,您可以始终获取由区域解析器解析的区域。
除了自动区域设置解析,您还可以将拦截器附加到处理程序映射(有关处理程序映射拦截器的更多信息,请参见 Interception)以在特定情况下更改区域设置(例如,基于请求中的参数)。
区域解析器和拦截器在 org.springframework.web.servlet.i18n
包中定义,并以正常方式在您的应用程序上下文中配置。以下是 Spring 中包含的一些区域解析器的选择。
时区
除了获取客户端的区域设置,了解其时区通常也很有用。LocaleContextResolver
接口为 LocaleResolver
提供了一个扩展,允许解析器提供更丰富的 LocaleContext
,其中可能包括时区信息。
当可用时,用户的 TimeZone
可以通过使用 RequestContext.getTimeZone()
方法获取。时区信息会被自动用于任何与 Spring 的 ConversionService
注册的日期/时间 Converter
和 Formatter
对象。
Header Resolver
此区域解析器检查客户端发送的请求中的 accept-language
头(例如,网页浏览器)。通常,此头字段包含客户端操作系统的区域设置。请注意,此解析器不支持时区信息。
Cookie Resolver
这个区域解析器检查客户端上可能存在的 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
的属性:
表 1. CookieLocaleResolver 属性
属性 | 默认值 | 描述 |
---|---|---|
cookieName | 类名 + LOCALE | cookie 的名称 |
cookieMaxAge | Servlet 容器默认值 | cookie 在客户端的最大存活时间。如果指定 -1 ,则 cookie 不会被持久化。它仅在客户端关闭浏览器之前可用。 |
cookiePath | / | 限制 cookie 在您网站某个部分的可见性。当指定 cookiePath 时,cookie 仅对该路径及其以下路径可见。 |
Session Resolver
SessionLocaleResolver
允许您从可能与用户请求相关联的会话中检索 Locale
和 TimeZone
。与 CookieLocaleResolver
相比,这种策略将本地选择的区域设置存储在 Servlet 容器的 HttpSession
中。因此,这些设置对每个会话都是临时的,因此在每个会话结束时会丢失。
请注意,它与外部会话管理机制(例如 Spring Session 项目)没有直接关系。这个 SessionLocaleResolver
会根据当前的 HttpServletRequest
评估和修改相应的 HttpSession
属性。
Locale Interceptor
您可以通过将 LocaleChangeInterceptor
添加到其中一个 HandlerMapping
定义中来启用更改区域设置。它会检测请求中的参数并相应地更改区域设置,在调度程序的应用程序上下文中调用 LocaleResolver
的 setLocale
方法。下一个示例显示,所有包含名为 siteLanguage
的参数的 *.view
资源的调用现在会更改区域设置。因此,例如,对 URL [www.sf.net/home.view?siteLanguage=nl](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>