Установка заголовка ответа после вызова doFilter - PullRequest
0 голосов
/ 03 мая 2019

Итак, я наблюдал некоторые ответы по этой теме, и я понимаю, что после завершения вызова doFilter () уже слишком поздно изменять заголовок repsonse, и для лучшей обработки этого случая я должен использовать оболочку ответа.

Я хочу знать, как справиться со случаем, когда я хочу установить заголовок, только если ответ, отправленный обратно в мой фильтр, имеет определенный код состояния.Должна ли эта логика обрабатываться до doFilter?В классе Request Wrapper?Я немного смущен.

@Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
        HttpServletRequest httpRequest;
        HttpServletResponse servlettResponse = (HttpServletResponse)response;
    CrossOriginResponseWrapper crossOriginResponseWrapper = new CrossOriginResponseWrapper(servlettResponse);
    if (crossOriginResponseWrapper.getStatus() == 404) {
        crossOriginResponseWrapper.addHeader("Access-Control-Allow-Origin", "*");
    }
    chain.doFilter(request, crossOriginResponseWrapper);


    LOG.info(crossOriginResponseWrapper.getHeader("Access-Control-Allow-Origin"));

    LOG.info(servlettResponse.getStatus());
}

ОБНОВЛЕНИЕ:

Является ли единственный способ решить эти переопределяющие методы в оболочке, чтобы ответ не записывался / не очищался до того, как он попадет в мой фильтр?Есть ли более простое решение?

(Ссылка на этот ответ) Ответ фиксируется, и цепочка doFilter разорвана

1 Ответ

0 голосов
/ 29 мая 2019

Нет, это единственный способ. Здесь у вас есть рабочий пример. https://github.com/sercasti/spring-httpserver-timings/blob/master/src/main/java/io/github/sercasti/tracing/filter/TracingFilter.java

Я обертываю оригинальный ответ в оболочку, что позволяет другим фильтрам не вызывать метод .write, который мгновенно фиксирует ответ и блокирует вас от добавления заголовков.

Используя эту оболочку, другие фильтры записывают в мою оболочку, а затем, когда мой фильтр возвращает элемент управления, я добавляю свои заголовки и эффективно записываю исходный ответ.

...