Spring Boot2 自定义过滤器

本文介绍了Spring Boot2中自定义过滤器的四种方式,包括使用@WebFilter+@ServletComponentScan、FilterRegistrationBean以及继承OncePerRequestFilter,并讨论了各自的优缺点,如路径指定、执行顺序控制等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值