Utilizzare SessionLocaleResolver e costruirlo come un bean denominato "localeResolver". Questo LocaleResolver risolverà le impostazioni locali verificando innanzitutto le impostazioni locali predefinite con cui è stato creato il resolver. Se è nullo, controllerà se una locale è stata memorizzata nella sessione e, se è nulla, imposterà le impostazioni locali della sessione in base all'intestazione Accept-Language nella richiesta.
Dopo che un utente ha effettuato l'accesso, è possibile chiamare localeResolver.setLocale per memorizzare una locale per la sessione, è possibile farlo in un filtro servlet (assicurarsi di definirlo nel proprio web.xml DOPO la sicurezza di primavera filtro).
Per accedere al vostro localeResolver (o altri fagioli) dal vostro filtro, fare qualcosa di simile nel metodo init:
@Override
public void init(FilterConfig fc) throws ServletException {
ServletContext servletContext = fc.getServletContext();
ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(servletContext);
this.localeResolver = context.getBean(SessionLocaleResolver.class);
}
Poi nel doFilterMethod, si dovrebbe essere in grado di lanciare il ServletRequest a un HttpServletRequest, chiama getRemoteUser, esegui qualsiasi logica di business per definire la locale dell'utente e chiama setLocale su LocaleResolver.
Personalmente, non mi interessa che SessionLocaleResolver utilizzi per prima il locale predefinito (preferisco l'ultimo), tuttavia è molto semplice estenderlo e sostituirlo. Se siete interessati a verificare la sessione, la richiesta, allora il valore di default, utilizzare il seguente:
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;
}
}
Dal momento che hai già il meccanismo per modificare le impostazioni internazionali, è possibile creare un custom [ 'AuthenticationSuccessHandler'] (http://static.springsource.org/spring- sicurezza/sito/docs/3.0.x/apidocs/org/springframework/security/web/authentication/AuthenticationSuccessHandler.html) per intercettare l'accesso e modificare le impostazioni locali in base alle preferenze dell'utente. Controlla [qui] (http://static.springsource.org/spring-security/site/docs/3.0.x/reference/springsecurity-single.html#nsa-form-login) e [qui] (http: // stackoverflow.com/a/6612634/468508) per maggiori informazioni. – bluefoot