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

时间:2019-07-10 09:41:27

标签: java spring-boot logging

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

但是,即使实际响应状态为400或405,它也始终记录200 OK。 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 个答案:

答案 0 :(得分:1)

更改

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);

原因: 名称链建议您有一个过滤器序列,每个过滤器都会进行一些处理,然后传递到下一个过滤器,因此每个对象都有一个链成员指向该序列中的下一个过滤器,{{1} }然后序列中的最后一个将以gets called after the filter has performed its own processing.作为链值,或者它自己知道它是序列中的最后一个。换句话说,您正在记录信息之前,过滤器已对其进行处理,结果为null