Spring MVC 七 - Locale 本地化

2023-09-13 22:23:52

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 Resolver

检查客户端发送上来的请求的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处理请求过程

更多推荐

蓝桥杯每日一题2023.9.21

蓝桥杯2021年第十二届省赛真题-异或数列-C语言网(dotcpp.com)题目描述Alice和Bob正在玩一个异或数列的游戏。初始时,Alice和Bob分别有一个整数a和b,有一个给定的长度为n的公共数列X1,X2,···,Xn。Alice和Bob轮流操作,Alice先手,每步可以在以下两种选项中选一种:选项1:从数

0 杂项知识

文章目录加密算法对称加密非对称加密散列加密sha-512与md5算法的对比加密算法参照:链接一般将加密算法分为三种:对称加密,非对称加密,散列加密对称加密对称加密就是只存在一把钥匙,这把钥匙可以用来加密文件,也可以用来解密文件(个人理解)常用于需要经常性沟通的加密,即给出钥匙的对方与己方需要有经常性的沟通。非对称加密非

【FAQ】安防监控系统/视频云存储EasyCVR平台安全检查Proxy出现sql injection的漏洞,该如何修改?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。最近有用户反馈,在使用视频监控系统EasyCVR平台安全扫描时,发现

企业工程项目管理系统源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)

工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理工程项目各模块及其功能点清单一、系统管理1、数据字典:实现对数据字典标签的增删改查操作2、编码管理:实现对系统编码的增删改查操作3、用户管理:管理和查看用户角

JVM调优笔记

双亲委派机制app---->ext----->bootstrap保证系统的核心库不被修改沙箱安全机制限制系统资源访问,将java代码限制在虚拟机特定的运行范围中基本组件字节码校验器确保java类文件遵循java规范,帮助java程序实现内存保护类加载器nativeJava的作用范围达不到了,需要调用底层栈栈内存主管程序

Java流式编程的使用

流式编程的使用步骤使用流式编程的步骤就是:设置数据源,设置数据处理的方式,设置收集结果的方式。使用filter方法实现过滤条件例子为下(查询年龄大于18的用户):@TestpublicvoidstreamTest1(){List<Student>students=Arrays.asList(newStudent("to

搜索——最短路模型,多源bfs

最短路模型,即求从起点到终点的最短路径,我们可以选择dijkstra,spfa等等,在这里我们可以利用宽搜(bfs)的特性来求,因为bfs是一层一层的向外扩展的,所以当我们第一次遍历到终点时,所在的层数即为起点到终点的最短路径。多源bfs,顾名思义,多个起点的bfs,与一般的bfs不同的地方在于根据题目要求,将多个起点

国外访问学者面签需要注意什么?

国外访问学者面签是前往国外进行学术研究或合作的关键一步,因此需要谨慎准备。以下是知识人网小编整理的一些需要注意的重要事项,以确保面签顺利进行:1.签证申请材料准备:首先,要仔细阅读所申请国家的签证要求,并准备所需的申请材料。通常,这些材料包括护照、签证申请表、邀请函、学术证明、财务证明和研究计划等。2.邀请函:如果你是

dirpro:专业的目录扫描工具教程

项目在github已开源,获取地址:https://github.com/coleak2021/dirpro1.简介dirpro是一款由python编写的目录扫描器,操作简单,功能强大,高度自动化自动根据返回状态码和返回长度,对扫描结果进行二次整理和判断,准确性非常高已实现功能可自定义扫描线程每扫描10%自动显示扫描进

位图的实现,布隆过滤器

位图:概念:由于位图是通过一个比特位来判断是不是在范围里面的,所以其对应的时间复杂度都是O(1)的。位图的实现:如上图所示:上图对应的就是3个字节,即24个比特位要想实现位图,就得知道我们要记录的这个数应该存储到哪个位置,假设这个数是x那么对应:x/32所得的值就是该数字应该存在第几个字节上x%32所得的值就是对应在此

传统的经典问题 Java 的 Interface 是干什么的

传统的经典问题Java的Interface是干什么解答上面的这个问题应该还是比较好回答的吧。只要你做过Java,通常Interface的问题多多少少会遇到,而且可能会遇到一大堆。在JAVA编程语言中是一个抽象类型(AbstractType),它被用来要求类(Class)必须实现指定的方法,使不同类的对象可以利用相同的界

热文推荐