如何在Spring-security登录页面中启用LocaleInterceptor来更改语言环境?

Kib*_*gon 6 locale spring-security internationalization

请原谅我,如果之前已经问过这个问题,但我还没有得到一个帮助我解决问题的直接答案.我有一个使用spring-security保护的gwt应用程序.Spring安全性只是验证用户身份并重定向到gwt应用程序.现在我希望用户能够从登录页面上的链接更改区域设置,之后区域设置将存储在cookie上并在应用程序中使用.

我在applicationContext.xml中有以下配置

<http auto-config="true">
    <intercept-url pattern="/mywebapp/**" access="ROLE_USER"/>
    <intercept-url pattern="/gwt/**" access="ROLE_USER"/>
    <intercept-url pattern="/**/*.html" access="ROLE_USER"/>
    <intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    <intercept-url pattern="/login.jsp*" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
    <form-login login-page="/login.jsp"/>
</http>
<beans:bean id="userDetailsService"
    class="com.kibet.mywebapp.server.auth.UserDetailsServiceImpl">
</beans:bean>

...
<!-- Application Message Bundle -->
<beans:bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <beans:property name="basename" value="classpath:messages" />
    <beans:property name="defaultEncoding" value="UTF-8"/>
</beans:bean>

<beans:bean id="localeChangeInterceptor"
class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
    <beans:property name="paramName" value="lang" />
</beans:bean>

<beans:bean id="localeResolver"
class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
    <beans:property name="defaultLocale" value="pt"/>
</beans:bean>

<beans:bean id="urlMapping"
     class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <beans:property name="interceptors">
    <beans:list>
        <beans:ref bean="localeChangeInterceptor"/>
    </beans:list>
    </beans:property>
    <beans:property name="mappings">
    <beans:value>/login.jsp=userDetailsService</beans:value>
    </beans:property>
</beans:bean>
Run Code Online (Sandbox Code Playgroud)

这似乎不起作用.我的类路径中有locale属性文件messages_en.properties,messages_es.properties和messages_pt.properties.它唯一有效的时间是我更改浏览器的默认语言环境.据我所知,登录页面是由spring-security生成的,处理程序映射不能拦截语言环境更改请求.如果这就是我如何解决这个问题的原因?非常感谢帮助.

这是我的自定义过滤器代码.

public class InternationalizationFilter implements Filter {

@Override
public void destroy() {
    // TODO Auto-generated method stub

}

@Override
public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain filterChain) throws IOException, ServletException {
    String newLocale = request.getParameter("lang");
    if (newLocale != null) {
        Locale locale = StringUtils.parseLocaleString(newLocale
                .toLowerCase());
        LocaleContextHolder.setLocale(locale);
    }
    try {
        filterChain.doFilter(request, response);
    } finally {

        LocaleContextHolder.resetLocaleContext();
    }
}

@Override
public void init(FilterConfig arg0) throws ServletException {

}}
Run Code Online (Sandbox Code Playgroud)

Rit*_*esh 1

LocaleChangeInterceptor是 Spring MVC 的一部分,这意味着它们不会出现在 Spring 安全过滤器中。您必须在过滤器链中自行设置区域设置。另请参阅Spring Security/SEC-1527:国际化示例应用程序之一