Java Spring安全性-本地化消息

Java Spring安全性-本地化消息,java,spring-security,localization,message,Java,Spring Security,Localization,Message,我正在尝试本地化Spring Security抛出的消息。我使用的是Spring 4.3.1和Spring Security 4.1.1。 使用messages.properties对其他值的本地化工作正常,只有Spring安全消息不能正常工作。无论使用何种语言,我总是收到相同的消息(在我的例子中,我总是收到德语消息(“Benutzername Order Passwort falsch”))。是否有我忘记配置的内容 来自mvc dispatcher servlet.xml的片段 <bea

我正在尝试本地化Spring Security抛出的消息。我使用的是Spring 4.3.1和Spring Security 4.1.1。 使用messages.properties对其他值的本地化工作正常,只有Spring安全消息不能正常工作。无论使用何种语言,我总是收到相同的消息(在我的例子中,我总是收到德语消息(“Benutzername Order 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>
AbstractUserDetailsAuthenticationProvider.badCredentials=Wrong username or password
field.username=Username
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>
消息\u en.properties

<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>
AbstractUserDetailsAuthenticationProvider.badCredentials=Wrong username or password
field.username=Username

根据Spring Security的官方文件

Spring安全性依赖于Spring的本地化支持,以便实际查找适当的消息。为了实现这一点,您必须确保传入请求的区域设置存储在Spring的org.springframework.context.i18n.LocaleContextHolder中。Spring MVC的DispatcherServlet会自动为您的应用程序执行此操作,但由于在此之前会调用Spring Security的筛选器,因此在调用筛选器之前,需要将LocaleContextHolder设置为包含正确的区域设置。您可以自己在过滤器中执行此操作(必须在web.xml中的Spring安全过滤器之前),也可以使用Spring的RequestContextFilter。请参阅Spring框架文档,了解有关使用Spring本地化的更多详细信息


解决方案:添加CustomLocaleFilter并在SecurityFilter之前注册它

使用此配置检查此链接“正常”本地化(字段名等)不再工作(我刚刚更改了
参数名(以匹配我的参数名))。是否有
消息。属性
?否,但这没什么区别(我试过了,结果是一样的),你有什么解决办法吗?我也有同样的问题。我尝试过这个链接,但没有成功。