Почему response.getStatus () возвращает 200 OK, даже если фактический ответ не - PullRequest
0 голосов
/ 10 июля 2019

Я реализую функцию, которая регистрирует весь доступ к моему API в файле журнала.В нем у меня есть код состояния ответа, а также некоторая информация, связанная с каждым доступом.Я получаю код состояния с помощью response.getStaus(), как показано в AppLogFilter.

Тем не менее, он всегда регистрирует 200 OK, даже когда фактический статус ответа равен 400 или 405. enter image description here

В чем здесь может быть проблема?

Конфигурация фильтра

package com.example.kasahararestapi.filter;

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean<ApiLogFilter> filterRegistrationBean() {
        FilterRegistrationBean<ApiLogFilter> registrationBean = new FilterRegistrationBean();
        registrationBean.setFilter(new ApiLogFilter());
        registrationBean.addUrlPatterns("/api/items/*");
        return registrationBean;
    }
}

ApiLogFilter

@Component
public class ApiLogFilter extends OncePerRequestFilter {

    private final Logger logger = LoggerFactory.getLogger(ApiLogFilter.class);


    @Override
    public final void doFilterInternal(
            HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        long startTime = System.currentTimeMillis();

        long processingTime = System.currentTimeMillis() - startTime;


        logger.info(
                "{} {} {} {}", request.getMethod(),
                request.getRequestURI(), response.getStatus(), processingTime);
        filterChain.doFilter(request, response);
    }

}

1 Ответ

1 голос
/ 10 июля 2019

Изменить

logger.info(
                "{} {} {} {}", request.getMethod(),
                request.getRequestURI(), response.getStatus(), processingTime);
        filterChain.doFilter(request, response);

На

filterChain.doFilter(request, response);
logger.info(
                "{} {} {} {}", request.getMethod(),
                request.getRequestURI(), response.getStatus(), processingTime);

Причина: Цепочка имен предполагает наличие последовательности фильтров, каждый фильтр выполняет некоторую обработку изатем переходя к следующему в последовательности, так что каждый объект имеет член цепочки, указывающий на следующий фильтр в последовательности, который gets called after the filter has performed its own processing. Последний в последовательности будет, вероятно, иметь null в качестве значения цепочки, или он знает,сам по себе, что это последний в последовательности.Другими словами, вы регистрируете информацию до , когда фильтр выполнил ее обработку, что приводит к статусу 200

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...