一光年

[Spring-Filter] 写一个Filter来打印请求日志

2019.06.21

在Spring框架中,有很多流程都可以打印Http请求日志,例如Filter和Interceptor就是非常合适的组件。

Filter是在Servlet范畴的处理,Intercepter则是在SpringMVC范畴内的处理。对于外部Http请求来讲,应该在接收到请求后立即打印请求内容,所以使用Filter来打印Http请求是更好的选择。

定义RequestFilter

新建一个RequestFilter类,加入以下打印日志的处理。

/**
 * Web请求过滤器
 */
@Slf4j
public class RequestFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest req, HttpServletResponse rsp, FilterChain filterChain) throws ServletException, IOException {
		
        String url = req.getRequestURL().toString();
        String method = req.getMethod();
        log.info("收到请求:{} {}", method, url);
		
        // 继续下一个过滤器
        filterChain.doFilter(req, rsp);
    }
}

将Filter加入App配置

对该Filter设置UrlPattern为"/*",意味着所有的路径请求都将经过该过滤器的处理。

@Configuration
public class WebAppConfig extends WebMvcConfigurationSupport {
    // 其它配置Bean
    ...
    
    @Bean
    public FilterRegistrationBean<RequestFilter> requestFilter() {
    
        FilterRegistrationBean<RequestFilter> filter = new FilterRegistrationBean<>();
    	
        filter.setOrder(Ordered.HIGHEST_PRECEDENCE + 9);
        filter.setFilter(new RequestFilter());
        filter.addUrlPatterns("/*");
    	
        return filter;
    }
}