本地化

如果您需要支持其他语言环境,本节包含您需要了解的一切。

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

spring-security-core-xx.jar 中,您可以找到一个 org.springframework.security 包,该包中包含一个 messages.properties 文件以及一些常用语言的本地化版本。您的 ApplicationContext 应该引用此文件,因为 Spring Security 类实现了 Spring 的 MessageSourceAware 接口,并期望在应用上下文启动时通过依赖注入方式注入消息解析器。通常,您只需在应用上下文中注册一个 bean 来引用这些消息即可。以下清单显示了一个示例:

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

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

要自定义 messages.properties 文件或支持其他语言,您应该复制该文件,相应地重命名它,并在前述 bean 定义中注册。此文件中的消息键不多,因此本地化不应被视为一项重大工作。如果您对此文件进行了本地化,请考虑通过创建 JIRA 任务并附上您已进行适当命名的本地化版本 messages.properties 文件来与社区分享您的工作。

Spring Security 依赖于 Spring 的本地化支持来查找适当的消息。为此,您必须确保来自传入请求的语言环境存储在 Spring 的 org.springframework.context.i18n.LocaleContextHolder 中。Spring MVC 的 DispatcherServlet 会自动为您的应用执行此操作。但是,由于 Spring Security 的过滤器在此之前调用,因此需要在调用过滤器之前设置 LocaleContextHolder 以包含正确的 Locale。您可以自己在一个过滤器中完成此操作(该过滤器在 web.xml 中必须位于 Spring Security 过滤器之前),或者您可以使用 Spring 的 RequestContextFilter。有关在 Spring 中使用本地化的更多详细信息,请参阅 Spring Framework 文档。

contacts 示例应用已设置为使用本地化消息。