Решение от Kafkaesque не является полным.
Но даже весенняя документация по безопасности неверна:
Необходимо настроить LocaleContextHolder так, чтобы он содержал правильный Locale, прежде чем фильтры будутназывается.Вы можете сделать это самостоятельно в фильтре (который должен предшествовать фильтрам Spring Security в web.xml) или использовать RequestContextFilter Spring.
см. https://docs.spring.io/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#localization
Выне может использовать RequestContextFilter
, так как этот фильтр не знает ни одного LocaleResolver
внутри вашего applicationContext.Он просто использует Locale из request.getLocale()
, который является Accept-Language
Header.
Если вы хотите использовать свой собственный LocaleResolver в этом фильтре, вам нужно написать свой собственный:
@Component
public class LocaleRequestContextFilter extends OncePerRequestFilter
{
// basiert auf RequestContextFilter
@Inject
private LocaleResolver localeResolver;
@Override
protected void doFilterInternal ( HttpServletRequest request, HttpServletResponse response, FilterChain filterChain ) throws ServletException, IOException
{
ServletRequestAttributes attributes = new ServletRequestAttributes(request, response);
initContextHolders(request, attributes);
try
{
filterChain.doFilter(request, response);
}
finally
{
resetContextHolders();
attributes.requestCompleted();
}
}
private void initContextHolders ( HttpServletRequest request, ServletRequestAttributes requestAttributes )
{
LocaleContextHolder.setLocaleContext(buildLocaleContext(request));
RequestContextHolder.setRequestAttributes(requestAttributes, false);
}
private LocaleContext buildLocaleContext ( final HttpServletRequest request )
{
request.setAttribute(DispatcherServlet.LOCALE_RESOLVER_ATTRIBUTE, localeResolver);
if (this.localeResolver instanceof LocaleContextResolver)
{
return ( (LocaleContextResolver) this.localeResolver ).resolveLocaleContext(request);
}
else
{
return new LocaleContext()
{
@Override
public Locale getLocale ( )
{
return localeResolver.resolveLocale(request);
}
};
}
}
private void resetContextHolders ( )
{
LocaleContextHolder.resetLocaleContext();
RequestContextHolder.resetRequestAttributes();
}
}
а затем настройте ваш web.xml
<filter>
<filter-name>localeRequestContextFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>localeRequestContextFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>