实现SpringBoot过滤器五种方式
在 Spring Boot 中,过滤器(Filter)是一种可以对请求和响应进行预处理和后处理的组件,常用于权限验证、日志记录、请求修改等。Spring Boot 提供了几种常用的过滤器实现方式,不同的过滤器类有不同的应用场景和生命周期管理方式。
以下是常见的过滤器实现方式,以及它们之间的主要区别:
实现 javax.servlet.Filter 接口
这是最基本的过滤器实现方式。Filter 是 Java Servlet 规范定义的接口,可以对请求和响应进行拦截和处理。它是 Spring Boot 过滤器体系的基础,所有其他过滤器都基于此接口实现。
实现步骤:
- 实现 Filter 接口。
- 覆盖 doFilter() 方法,处理请求和响应。
- 在 Filter 中进行拦截逻辑的编写。
示例:
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化逻辑
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
// 过滤逻辑
chain.doFilter(request, response); // 继续过滤链
}
@Override
public void destroy() {
// 销毁逻辑
}
}
区别和特点:
- 需要手动注册:在 Spring Boot 中,通常需要通过 @Bean 或 @WebFilter 注解手动注册该过滤器。
- 通用性强:可以处理所有类型的 HTTP 请求,无特定功能要求。
继承 OncePerRequestFilter
OncePerRequestFilter 是 Spring 提供的过滤器基类,确保过滤器在一次请求中只被执行一次,避免重复执行。这在过滤器需要进行耗时操作或者只能在请求生命周期中执行一次的情况下非常有用。
实现步骤:
- 继承 OncePerRequestFilter 类。
- 实现 doFilterInternal() 方法,处理请求和响应。
示例:
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class MyOncePerRequestFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws IOException {
// 过滤逻辑
filterChain.doFilter(request, response); // 继续过滤链
}
}
区别和特点:
- 只执行一次:确保每个请求在其生命周期中只调用一次过滤器。
- 适合耗时操作:适用于需要全局一次性拦截请求的场景。
- 更高抽象层次:简化了 doFilter() 方法的调用链,特别是在处理 HTTP 请求时。
继承 GenericFilterBean
GenericFilterBean 是 Spring 提供的一个过滤器基类,它简化了过滤器的创建和 Bean 管理。这是一个抽象类,直接继承了 Filter 接口并实现了初始化和销毁方法。开发者只需要实现 doFilter() 方法即可。
实现步骤:
- 继承 GenericFilterBean。
- 覆盖 doFilter() 方法,处理请求和响应。
示例:
import org.springframework.web.filter.GenericFilterBean;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
public class MyGenericFilter extends GenericFilterBean {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 过滤逻辑
chain.doFilter(request, response); // 继续过滤链
}
}
区别和特点:
- 简化 Bean 管理:无需手动实现 init() 和 destroy() 方法,适合 Bean 过滤器。
- Spring 集成更好:作为 Spring Filter 的一个实现,它的生命周期与 Spring 上下文绑定。
使用 @WebFilter 注解
@WebFilter 是 Servlet 3.0 规范的一部分,允许使用注解来定义过滤器,而无需在 web.xml 中进行配置。这种方式主要适用于 Spring Boot 配合 Servlet 容器(如 Tomcat)时,简单快速地注册过滤器。
示例:
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.annotation.WebFilter;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@WebFilter(urlPatterns = "/api/*")
public class MyWebFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
// 过滤逻辑
chain.doFilter(request, response); // 继续过滤链
}
@Override
public void init(FilterConfig filterConfig) {
// 初始化逻辑
}
@Override
public void destroy() {
// 销毁逻辑
}
}
区别和特点:
- 基于注解的配置:无需手动注册过滤器,简化配置。
- 绑定 URL 模式:可以通过 urlPatterns 参数来绑定具体路径。
自定义 Spring FilterRegistrationBean
FilterRegistrationBean 是 Spring Boot 提供的一种过滤器注册方式,允许以编程方式注册和配置过滤器。这种方式更灵活,适合需要动态配置过滤器的场景。
实现步骤:
- 定义过滤器实现类。
- 使用 FilterRegistrationBean 将过滤器注册为 Spring Bean。
示例:
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<MyFilter> myFilter() {
FilterRegistrationBean<MyFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new MyFilter());
registrationBean.addUrlPatterns("/api/*");
return registrationBean;
}
}
区别和特点:
- 灵活配置:可以动态地绑定过滤器和 URL,甚至可以在运行时调整过滤器的配置。
- 优先级控制:可以通过 setOrder() 设置过滤器的执行顺序。
主要区别总结
方式 | 特点 | 使用场景 |
---|---|---|
实现 javax.servlet.Filter | 基本过滤器,适用于所有 Servlet 环境 | 通用场景,定制过滤逻辑 |
继承 OncePerRequestFilter | 确保过滤器每个请求只执行一次 | 防止重复执行的场景 |
继承 GenericFilterBean | 与 Spring 上下文集成良好,简化 Filter 生命周期管理 | Spring 环境下更方便的过滤器 |
@WebFilter 注解 | 基于注解的方式注册过滤器 | Servlet 容器环境下快速配置 |
FilterRegistrationBean | 动态配置过滤器及其 URL 模式,支持优先级控制 | 需要灵活注册和配置过滤器的场景 |
选择哪种过滤器方式取决于你对应用程序的需求,是否需要和 Spring 进行深度集成,以及是否需要灵活地控制过滤器的执行顺序或路径配置。
还没有人赞赏,快来当第一个赞赏的人吧!
- 2¥
- 5¥
- 10¥
- 20¥
- 50¥
声明:本文为原创文章,版权归信息岛所有,欢迎分享本文,转载请保留出处!