“Committing a transaction for req : {}”,
req.getRequestURI());
}
}
结果日志如下:
[nio-8080-exec-3] com.laker.notes.easy.filter.FirstFilter : Starting a transaction for req : /
[nio-8080-exec-3] c.laker.notes.easy.filter.SecondFilter : Starting a transaction for req : /
[nio-8080-exec-3] c.laker.notes.easy.filter.SecondFilter : Committing a transaction for req : /
[nio-8080-exec-3] com.laker.notes.easy.filter.FirstFilter : Committing a transaction for req : /
缺点:无法指定过滤器拦截的路径
[](()2.2 @WebFilter+@ServletComponentScan
@WebFilter
这个注解属于Servlet3+,与Spring也没有什么关系,代码如下:
-
使用注解
@WebFilter
,必须实现Filter
接口 -
开启
@ServletComponentScan
@WebFilter(“/*”)
@Slf4j
public class SecondFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
log.info(
“Starting a transaction for req : {}”,
req.getRequestURI());
filterChain.doFilter(servletRequest, servletResponse);
log.info(
“Committing a transaction for req : {}”,
req.getRequestURI());
}
}
@ServletComponentScan
@SpringBootApplication
public class LakerEasyApplication {
public static void main(String[] args) {
SpringApplication.run(Lak 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 erEasyApplication.class, args);
}
}
缺点:无法指定多个filter的执行顺序,@Order注解在这里即使指定了也不生效的
[](()2.3 FilterRegistrationBean
包装bean注册方式
@Bean
public FilterRegistrationBean firstFilter() {
FilterRegistrationBean registrationBean
= new FilterRegistrationBean<>();
registrationBean.setFilter(new FirstFilter());
registrationBean.addUrlPatterns(“/*”);
registrationBean.setOrder(2);
return registrationBean;
}
@Bean
public FilterRegistrationBean secondFilter() {
FilterRegistrationBean registrationBean
= new FilterRegistrationBean<>();
registrationBean.setFilter(new SecondFilter());
registrationBean.addUrlPatterns(“/*”);
registrationBean.setOrder(1);
return registrationBean;
}
[nio-8080-exec-1] c.laker.notes.easy.filter.SecondFilter : Starting a transaction for req : /
[nio-8080-exec-1] com.laker.notes.easy.filter.FirstFilter : Starting a transaction for req : /
[nio-8080-exec-1] com.laker.notes.easy.filter.FirstFilter : Committing a transaction for req : /
[nio-8080-exec-1] c.laker.notes.easy.filter.SecondFilter : Committing a transaction for req : /
这种就很舒服既可以设置过滤的路径,又可以设置执行顺序
[](()2.4 继承OncePerRequestFilter
@Order(value = Ordered.HIGHEST_PRECEDENCE)
@Component
@WebFilter(filterName = “ContentCachingFilter”, urlPatterns = “/*”)
public class ContentCachingFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
System.out.println("IN ContentCachingFilter ");
CachedBodyHttpServletRequest cachedBodyHttpServletRequest = new CachedBodyHttpServletRequest(httpServletRequest);
filterChain.doFilter(cachedBodyHttpServletRequest, httpServletResponse);
}
}