Java 为什么response.getStatus()返回200 OK,即使实际响应不是

Java 为什么response.getStatus()返回200 OK,即使实际响应不是,java,spring-boot,logging,Java,Spring Boot,Logging,我正在实现一个功能,将对API的所有访问记录在日志文件中。在其中,我有响应状态代码以及与每次访问相关的一些信息。我通过response.getStaus()检索状态代码,如AppLogFilter所示 但是,即使实际响应状态为400或405,它也始终记录200 OK。 我这里有什么问题 过滤器配置 package com.example.kasahararestapi.filter; import org.springframework.boot.web.servlet.FilterRegi

我正在实现一个功能,将对API的所有访问记录在日志文件中。在其中,我有响应状态代码以及与每次访问相关的一些信息。我通过
response.getStaus()
检索状态代码,如AppLogFilter所示

但是,即使实际响应状态为400或405,它也始终记录200 OK。

我这里有什么问题

过滤器配置

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;
    }
}
改变

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

原因:
名称链表明您有一个过滤器序列,每个过滤器进行一些处理,然后传递到序列中的下一个过滤器,因此每个对象都有一个链成员,指向序列中的下一个过滤器,在筛选器执行其自己的处理后调用它。序列中的最后一个可能将
null
作为链值,或者它自己知道它是序列中的最后一个。换句话说,在筛选器执行信息处理之前,您正在记录该信息,这将导致状态为
200

您在
filterChain.doFilter(请求、响应)之前调用该方法因此默认值为
200
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);