Я добавил класс фильтра с аннотацией @WebFilter для проверки состояния входа в систему.
И я также добавил localeResolver и перехватчик для интернационализации.
Они отлично работают.
Проблема в том, что
если пользователь не вошел в систему, он увидит предупреждающее сообщение, оно не из текущей локали.
Я проверил журналы и обнаружил, что локаль сначала была установлена на 'en_US', но когда запрос перешел в мой класс фильтра, он стал ko_KR, а затем после моего фильтра снова был установлен 'en_US'.
кратко,
index (en) -> доступ к странице без входа в систему (en) -> фильтр (ko) -> alert (ko) -> index (en).
Сначала я подумал, что это произошло, потому что каким-то образом cookie был исключен из запроса во время его пересылки. Но это не так.
Любые возможные причины?
Фильтр
@WebFilter(urlPatterns = "/adm/*", description = "Login Authentication Filter")
@Slf4j
public class LoginFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("Login Filter Initialized");
}
private final void _forward(ServletRequest request, ServletResponse response, String msgCode, String to) throws IOException, ServletException {
request.setAttribute("data", new Message(msgCode, to));
request.getRequestDispatcher("/message").forward(request, response);
}
private final boolean _isNotLogin(HttpServletRequest request) {
// blahblah
}
private final boolean _differentIp(HttpServletRequest request) {
// blahblah
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest _request = (HttpServletRequest) request;
HttpSession session = _request.getSession();
if (session == null) { _forward(request, response, "user.error.login_required", "/"); return; }
if (_isNotLogin(_request)) { _forward(request, response, "user.error.login_required", "/"); return; }
if (_differentIp(_request)) { _forward(request, response, "user.error.login_required", "/"); return; }
chain.doFilter(request, response);
}
}
Locale
@Configuration
public class LocaleConfig implements WebMvcConfigurer {
final String KEY_LANG = "admin_language";
@Bean(name = "localeResolver")
public LocaleResolver localeResolver() {
CookieLocaleResolver resolver = new CookieLocaleResolver();
resolver.setCookieMaxAge(365 * 24 * 60 * 60);
resolver.setCookieName(KEY_LANG);
return resolver;
}
@Bean(name = "messageSource")
public ReloadableResourceBundleMessageSource getMessageResource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:locale/messages");
messageSource.setDefaultEncoding("UTF-8");
messageSource.setCacheSeconds(-1);
return messageSource;
}
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
lci.setParamName(KEY_LANG);
lci.setHttpMethods("GET");
return lci;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor())
.addPathPatterns("/**");
log.info("Locale Config initialized");
}
}