我正在实现一项功能,该功能会将对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;
}
}
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);
}
}
答案 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