在国际化资源时,我们会通过浏览器的语言选项判断客户端的本地化类型,例如我在中国,浏览器默认显示中文字符,那么用户在访问服务器时,浏览器中设置的本地化类型会包含在HTML
请求报文中发送给Web
服务器,如请求报文中的Accept-Language
参数,假如用户修改了浏览器的本地化类型,鉴于国际化资源时,我们应该根据用户的需求动态的切换提示语或者其他信息。
再比如我们见过某某网站上有英文、中文、繁体切换的按钮,这种切换不要求用户更改浏览器选项,这些可以通过cookie/session/请求参数
来切换本地化类型。
在默认情况下,springmvc根据Accept-Language
判断用户的本地化类型。
在spring
容器启动时,会在上下文中寻找LocaleResolver
本地化解析器,spring
提供了3个本地化解析器和1个本地化拦截器:AcceptHeaderLocaleResolver、CookieLocaleResolver、SessionLocaleResolver、LocaleContextResolver、LocaleChangeInterceptor
在spring
上下文中,有且只有一个该实例。 DispatcherServlet
初始化LocaleResolver
protected void initStrategies(ApplicationContext context) {
initLocaleResolver(context);
}
-
AcceptHeaderLocaleResolver
根据HTTP
报文头的Accept-Language
参数确定本地化类型。如果没有显示定义本地化解析器,Spring MVC
默认采用此解析器 -
CookieLocaleResolver
根据指定的Cookie
值确定本地化类型。在spring
配置文件中配置CookieLocaleResolver
,DispatcherServlet
自动识别并装配。客户端只要通过JavaScript
更改clientLanguage
这个cookie
的值,就可以控制服务器返回相应的本地化页面。<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"> <!-- 其他属性在 CookieGenerator 中 --> <property name="defaultLocale" value="zh_CN"/> <property name="cookieName" value="clientLanguage"/> <property name="cookiePath" value="/" /> <property name="cookieMaxAge" value="100000"/> </bean>
-
SessionLocaleResolver
根据Session
中特定的属性值确定本地化类型。SessionLocaleResolver
会查找Session
中属性名为SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME
的属性,并将其转成Locale对象,作为客户端的本地化类型。在spring
配置文件中加入以下代码即可。<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"></bean>
SessionLocaleResolver
和CookieLocaleResolver
的区别是:前者一般要求用户登录后生成相应的用户会话才有效,而后者只要浏览器有Cookie
存在即可。 -
LocaleChangeInterceptor
从请求参数中获取本次请求对应的本地化类型。很多网站都允许通过一个参数控制网站的本地化,如www.xxx.com?locale=zh_CN
返回对应中国大陆的本地化网页。Spring MVC
提供LocaleChangeInterceptor
拦截器完成。
在Spring MVC
上下文中通过<mvc:interceptors>
配置拦截器。<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"> <!-- 其他属性在 CookieGenerator 中 --> <property name="defaultLocale" value="zh_CN"/> <property name="cookieName" value="clientLanguage"/> <property name="cookiePath" value="/" /> <property name="cookieMaxAge" value="100000"/> </bean> <mvc:interceptors> <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean> </mvc:interceptors>
LocaleChangeInterceptor
在默认情况下通过locale
请求参数获取本次请求对应的本地化类型,用户可以通过其paramName
属性指定一个其他参数名。由于LocaleChangeInterceptor
的主要任务是从请求中获取本地化类型并将其设置给真正的本地化解析器,所以在配置LocaleChangeInterceptor
之前,必须在上下文中先配置一个本地化解析器。由于AcceptHeaderLocaleResolver
是从请求报文头获取本地化信息的,不能被动更改,因此只能选择CookieLocaleResolver
或SessionLocaleResolver