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

В чем тут может быть проблема?
Конфигурация фильтра
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;
}
}
Апилогфильтр
@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);
}
}




Изменять
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
вы вызывали этот метод до
filterChain.doFilter(request, response);, поэтому значение по умолчанию равно200