1. 程式人生 > >Spring MVC之LocaleResolver

Spring MVC之LocaleResolver

在國際化資源時,我們會通過瀏覽器的語言選項判斷客戶端的本地化型別,例如我在中國,瀏覽器預設顯示中文字元,那麼使用者在訪問伺服器時,瀏覽器中設定的本地化型別會包含在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配置檔案中配置CookieLocaleResolverDispatcherServlet自動識別並裝配。客戶端只要通過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>
    

    SessionLocaleResolverCookieLocaleResolver的區別是:前者一般要求使用者登入後生成相應的使用者會話才有效,而後者只要瀏覽器有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是從請求報文頭獲取本地化資訊的,不能被動更改,因此只能選擇CookieLocaleResolverSessionLocaleResolver