Используйте SessionLocaleResolver и создайте его как фасоль под названием «localeResolver». Этот LocaleResolver разрешит локали, предварительно проверив локаль по умолчанию, с которой был создан резольвер. Если это значение равно null, оно проверяет, сохранен ли языковой стандарт в сеансе, и если это значение равно null, он установит локаль сеанса на основе заголовка Accept-Language в запросе.
После входа пользователя вы можете вызвать localeResolver.setLocale, чтобы сохранить локаль для сеанса для вас, вы можете сделать это в фильтре сервлета (обязательно определите его в своем web.xml ПОСЛЕ вашей весенней безопасности фильтр).
Чтобы получить доступ к localeResolver (или другие бобы) из вашего фильтра, сделать что-то подобное в методе инициализации:
@Override
public void init(FilterConfig fc) throws ServletException {
ServletContext servletContext = fc.getServletContext();
ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(servletContext);
this.localeResolver = context.getBean(SessionLocaleResolver.class);
}
Тогда в doFilterMethod, вы должны быть в состоянии бросить ServletRequest Ань HttpServletRequest, вызовите getRemoteUser, выполните любую бизнес-логику, чтобы определить эту локаль пользователя, и вызовите setLocale в LocaleResolver.
Лично я не хочу, чтобы SessionLocaleResolver сначала использовал локальную по умолчанию (я предпочитаю последний), однако ее очень легко расширить и переопределить. Если вы заинтересованы в проверке сессии, то запрос, то по умолчанию, используйте следующее:
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;
}
}
Поскольку у вас уже есть механизм, чтобы изменить региональные настройки, вы можете создать собственный [ 'AuthenticationSuccessHandler'] (http://static.springsource.org/spring- security/site/docs/3.0.x/apidocs/org/springframework/security/web/authentication/AuthenticationSuccessHandler.html), чтобы перехватить логин и изменить локаль на основе предпочтений пользователя. Проверьте [здесь] (http://static.springsource.org/spring-security/site/docs/3.0.x/reference/springsecurity-single.html#nsa-form-login) и [здесь] (http: // stackoverflow.com/a/6612634/468508) для получения дополнительной информации. – bluefoot