Spring security + LocaleResolver

ela*_*las 3 java locale spring-mvc spring-security

我需要在成功验证后更改区域设置.

LocaleResolver中:

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

   <bean id="localeResolver"
     class="web.MyLocaleResolver">
   </bean>
Run Code Online (Sandbox Code Playgroud)
   public class MyLocaleResolver extends AbstractLocaleResolver {

   private Locale default = Locale.ENGLISH;

       @Override
       public Locale resolveLocale(HttpServletRequest hsr) {
           return this.default;
       }

       @Override
       public void setLocale(HttpServletRequest hsr, HttpServletResponse hsr1,         Locale default) {
           this.default = default;
       }

   }
Run Code Online (Sandbox Code Playgroud)

安全:

     <form-login login-page="/login" 
          authentication-success-handler- ref="MySuccessAuthHandler"/>
     <beans:bean id="MySuccessAuthHandler" class="web.MySuccessfulAuthenticationHandler">
         <beans:property name="defaultTargetUrl" value="/index.htm"></beans:property>
     </beans:bean>
Run Code Online (Sandbox Code Playgroud)
public class MySuccessfulAuthenticationHandler extends  SavedRequestAwareAuthenticationSuccessHandler  {
  @Override
  public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
        Authentication authentication) throws ServletException, IOException {

        super.onAuthenticationSuccess(request, response, authentication);
        RequestContextUtils.getLocaleResolver(request).setLocale(request, response, Locale.ENGLISH);
   }

}
Run Code Online (Sandbox Code Playgroud)

当我尝试设置语言环境时,RequestContextUtils我得到NullPointer异常.

axt*_*avt 9

LocaleResolver在请求上下文中公开DispatcherServlet,而AuthenticationSuccessHandler在请求进入之前被触发DispatcherServlet(实际上,被激活的请求SavedRequestAwareAuthenticationSuccessHandler永远不会进入DispatcherServlet,因为此处理程序执行重定向).

因此,在这种情况下,您无法访问LocaleResolvervia RequestContextUtils.你可以尝试注入LocaleResolver到你的AuthenticationSuccessHandler明确,例如,与自动装配.