Spring MVC 七 - Locale 本地化

Spring各模块都支持国际化,SpringMVC也同样支持。DispatcherServlet通过Locale Resovler自动根据客户端的Locale支持国际化。

request请求上来后,DispatcherServlet查找并设置Locale Resovler,我们可以通过RequestContext.getLocale()获取到对应的Locale。

此外,可以利用拦截器在特定情况下修改locale,比如,根据请求参数修改locale。这项功能对于通过页面选项指定locale的应用非常有用(比如在页面上选择中文/英文的方式指定应用的语言)。

Locale Resolver和拦截器定义在org.springframework.web.servlet.i18n包,可以通过配置文件指定,Spring支持如下locale resolver:

  1. Time Zone
  2. Header Resolver
  3. Cookie Resovlver
  4. Session Resolver
  5. Locale Interceptor

Time Zone

除获取用户locale之外,有时候也需要获取到用户的时区,LocaleContextResolver接口通过扩展LocaleResovler可提供对时区的支持。

可通过RequestContext.getTimeZone() 获取用户时区。

Header Resolver

Header Resolver通过解析请求头的accept-language,从而获取到客户端浏览器发送上来的相关头信息。

SpringMVC提供的Header Resolver:AcceptHeaderLocaleResolver。

浏览器默默认会发送相关的请求头信息:

SpringMVC通过DispatcherServlet.properties指定的默认LocaleResolver正是Header Resolver:

复制代码
org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver

检查客户端发送上来的请求的cookie中是否包含Locale或TimeZone信息,如包含则应用该信息创建Locale。

SpringMVC提供的Cookie Resolver:org.springframework.web.servlet.i18n.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>

Session Resolver

SessionLocaleResolver通过session获取客户端的Locale和TimeZone信息,信息存储在HttpSession中,随着session的失效而失效。

Locale Interceptor

使用拦截器、通过页面参数设置Locale。SpringMVC提供了一个LocaleChangeInterceptor拦截器,可以直接使用。

比如:

复制代码
<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>

配置localeChangeInterceptor,指定其参数名称为siteLanguage,将该拦截器配置到SimpleUrlHandlerMapping上,对*.view请求,根据请求参数siteLanguage决定其locale。

上一篇 Spring MVC 六 - DispatcherServlet处理请求过程

相关推荐
寻星探路4 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
曹牧6 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
爬山算法7 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty7257 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎7 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
李少兄7 小时前
在 IntelliJ IDEA 中修改 Git 远程仓库地址
java·git·intellij-idea
忆~遂愿7 小时前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
小韩学长yyds7 小时前
Java序列化避坑指南:明确这4种场景,再也不盲目实现Serializable
java·序列化
仟濹7 小时前
【Java基础】多态 | 打卡day2
java·开发语言