我试图本地化Spring Security抛出的消息。我使用的是Spring 4.3.1和Spring Security 4.1.1。 使用messages.properties进行其他值的本地化工作正常,只有Spring Security消息无法正常工作。无论语言如何,我总是得到相同的信息(在我的情况下,我总是得到德语信息(" Benutzername oder Passwort falsch"))。有什么东西我忘了配置吗?
来自mvc-dispatcher-servlet.xml的片段
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames" value="messages"/>
</bean>
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"/>
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="language"/>
</bean>
</mvc:interceptors>
loadByUsername方法(如果需要)
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DisabledException {
Member member = memberDao.getMember(username);
if (member == null) {
throw new UsernameNotFoundException("user not found...");
} ...
的web.xml
<!--DispatcherServlet-->
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--ContextLoaderListener-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/mvc-dispatcher-servlet.xml,
/WEB-INF/spring-security.xml
</param-value>
</context-param>
<filter>
<filter-name>requestContextFilter</filter-name>
<filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>requestContextFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Spring Security Chain Filter -->
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
messages_de.properties
AbstractUserDetailsAuthenticationProvider.badCredentials=Benutzername oder Passwort falsch
field.username=Benutzername
messages_en.properties
AbstractUserDetailsAuthenticationProvider.badCredentials=Wrong username or password
field.username=Username
答案 0 :(得分:0)
根据Spring Security的官方文档...
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文档。
解决方案::添加一个CustomLocaleFilter并将其注册到SecurityFilters之前