本地化

本站(springdoc.cn)中的内容来源于 spring.io ,原始版权归属于 spring.io。由 springdoc.cn 进行翻译,整理。可供个人学习、研究,未经许可,不得进行任何转载、商用或与之相关的行为。 商标声明:Spring 是 Pivotal Software, Inc. 在美国以及其他国家的商标。

Spring Security支持对终端用户可能看到的异常信息进行本地化。如果你的应用程序是为讲英语的用户设计的,你不需要做任何事情,因为在默认情况下,所有的 Security 消息都是英文的。如果你需要支持其他地区的语言,本节包含了你需要知道的一切。

所有的异常信息,包括与认证失败和访问被拒绝(授权失败)有关的信息,都可以被本地化。针对开发者或系统部署者的异常和日志信息(包括不正确的属性、违反接口约束、使用不正确的构造函数、启动时验证、debug级日志)不被本地化,而是在Spring Security的代码中用英文硬编码。

spring-security-core-xx.jar 中,你会发现一个 org.springframework.security 包,它又包含一个 messages.properties 文件,以及一些常用语言的本地化版本。你的 ApplicationContext 应该参考这个文件,因为 Spring Security 类实现了Spring的 MessageSourceAware 接口,并期望消息解析器在 application context 启动时被依赖注入。通常情况下,你需要做的就是在你的 application context 中注册一个Bean来引用这些消息。下面的列表显示了一个例子。

<bean id="messageSource"
	class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="classpath:org/springframework/security/messages"/>
</bean>

messages.properties 是按照标准资源包(resource bundles)命名的,代表了 Spring Security 消息所支持的默认语言。这个默认文件是英文的。

要定制 messages.properties 文件或支持其他语言,你应该复制该文件,对其进行相应的重命名,并在前面的 bean 定义中注册。这个文件里面没有大量的 message key,所以本地化不应该被认为是一个重要的举措。如果你真的对这个文件进行了本地化,请考虑与社区分享你的工作,记录一个JIRA任务,并附上你适当命名的 messages.properties 的本地化版本。

Spring Security依赖于Spring的本地化支持,以便实际查找适当的消息。要做到这一点,你必须确保来自传入请求的locale被存储在Spring的 org.springframework.context.i18n.LocaleContextHolder 中。Spring MVC的 DispatcherServlet 会自动为你的应用程序做这个。然而,由于Spring Security的过滤器在这之前被调用,因此在过滤器被调用之前, LocaleContextHolder 需要被设置为包含正确的 Locale。你可以自己在过滤器中做到这一点(在 web.xml 中必须在Spring Security的过滤器之前),或者你可以使用Spring的 RequestContextFilter。关于使用Spring本地化的进一步细节,请参见Spring框架文档。

contacts 示例应用程序被设置为使用本地化的信息。