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
配置檔案中配置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