Utilice SessionLocaleResolver y contrólelo como un bean llamado "localeResolver". Este LocaleResolver resolverá las configuraciones regionales al verificar primero la configuración regional predeterminada con la que se construyó el sistema de resolución. Si es nulo, comprobará si se ha almacenado una configuración regional en la sesión y, si es nula, configurará la configuración regional de la sesión según el encabezado Aceptar idioma de la solicitud.
Después de que un usuario haya iniciado sesión, puede llamar a localeResolver.setLocale para almacenar una configuración regional en la sesión, puede hacerlo en un filtro de servlet (asegúrese de definirlo en su web.xml DESPUÉS de su seguridad de primavera filtrar).
Para obtener acceso a su localeResolver (u otros granos) de su filtro, hacer algo como esto en el método init:
@Override
public void init(FilterConfig fc) throws ServletException {
ServletContext servletContext = fc.getServletContext();
ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(servletContext);
this.localeResolver = context.getBean(SessionLocaleResolver.class);
}
Luego, en el doFilterMethod, usted debe ser capaz de emitir el ServletRequest a una HttpServletRequest, llame a getRemoteUser, realice cualquier lógica comercial para definir la configuración regional de ese usuario y llame a setLocale en LocaleResolver.
Personalmente, no me importa que el SessionLocaleResolver use primero el local predeterminado (prefiero el último), sin embargo, es muy fácil de ampliar y anular. Si usted está interesado en el control de la sesión, entonces la petición, el valor por defecto, utilice la siguiente:
import org.springframework.stereotype.Component;
import org.springframework.web.util.WebUtils;
import javax.servlet.http.HttpServletRequest;
import java.util.Locale;
// The Spring SessionLocaleResolver loads the default locale prior
// to the requests locale, we want the reverse.
@Component("localeResolver")
public class SessionLocaleResolver extends org.springframework.web.servlet.i18n.SessionLocaleResolver{
public SessionLocaleResolver(){
//TODO: make this configurable
this.setDefaultLocale(new Locale("en", "US"));
}
@Override
public Locale resolveLocale(HttpServletRequest request) {
Locale locale = (Locale) WebUtils.getSessionAttribute(request, LOCALE_SESSION_ATTRIBUTE_NAME);
if (locale == null) {
locale = determineDefaultLocale(request);
}
return locale;
}
@Override
protected Locale determineDefaultLocale(HttpServletRequest request) {
Locale defaultLocale = request.getLocale();
if (defaultLocale == null) {
defaultLocale = getDefaultLocale();
}
return defaultLocale;
}
}
Puesto que ya tiene el mecanismo para cambiar la configuración regional, puede crear una costumbre [ 'AuthenticationSuccessHandler'] (http://static.springsource.org/spring- security/site/docs/3.0.x/apidocs/org/springframework/security/web/authentication/AuthenticationSuccessHandler.html) para interceptar el inicio de sesión y cambiar la configuración regional según las preferencias del usuario. Marque [aquí] (http://static.springsource.org/spring-security/site/docs/3.0.x/reference/springsecurity-single.html#nsa-form-login) y [aquí] (http: // stackoverflow.com/a/6612634/468508) para más información. – bluefoot