Используйте SessionLocaleResolver и создайте его как компонент с именем "localeResolver".Этот LocaleResolver разрешит языковые стандарты, сначала проверив языковой стандарт по умолчанию, с которым был создан преобразователь.Если это значение равно NULL, он проверит, сохранен ли языковой стандарт в сеансе, и если оно имеет значение NULL, он установит языковой стандарт сеанса на основе заголовка Accept-Language в запросе.
После входа пользователя в системуНапример, вы можете вызвать localeResolver.setLocale, чтобы сохранить для вас локаль для сеанса, вы можете сделать это в фильтре сервлетов (обязательно укажите его в своем файле web.xml ПОСЛЕ вашего весеннего фильтра безопасности).
Чтобы получить доступ к вашему localeResolver (или другим компонентам) из вашего фильтра, выполните что-то вроде этого в методе init:
@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;
}
}