本地化

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

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

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

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

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

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

如果你想定制 messages.properties 文件,或支持其他语言,你应该复制该文件,并相应地重命名,然后在上述 bean 定义中注册。这个文件里面没有大量的消息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" 示例应用程序被设置为使用本地化的信息。