本地化
如果您需要支持其他语言环境,本节包含您需要了解的所有内容。
所有异常消息都可以进行本地化,包括与身份验证失败和访问被拒绝(授权失败)相关的消息。针对开发人员或系统部署人员的异常和日志消息(包括属性错误、接口契约违反、使用错误的构造函数、启动时间验证、调试级别日志)不会被本地化,而是以英文硬编码在 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 的过滤器在 `DispatcherServlet` 之前调用,因此需要在调用过滤器之前将 `LocaleContextHolder` 设置为包含正确的 `Locale`。您可以在过滤器中自己执行此操作(该过滤器必须在 `web.xml` 中位于 Spring Security 过滤器之前),或者可以使用 Spring 的 `RequestContextFilter`。有关使用 Spring 进行本地化的更多详细信息,请参阅 Spring 框架文档。
"contacts" 示例应用程序已设置为使用本地化消息。