У фильтра, помеченного как @WebFilter, контекст локали отличается от приложения? - PullRequest
0 голосов
/ 03 мая 2019

Я добавил класс фильтра с аннотацией @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");
    }
}
...