【springboot】拦截器和过滤器的区别
- 【一】区别
- 【二】适用场景
- 【1】过滤器
- 【2】拦截器
- 【三】使用案例
- 【1】过滤器使用案例
- 【2】拦截器使用案例
在 Spring Boot 中,拦截器(Interceptor)和过滤器(Filter)都是用于对请求进行预处理和后处理的机制,但它们存在一些区别,适用于不同的场景。下面将详细介绍它们的区别、适用场景,并给出使用案例。
【一】区别
(1)所属规范
过滤器:过滤器是 Servlet 规范中的一部分,是 Java EE 标准的一部分,依赖于 Servlet 容器。在 Spring Boot 项目中,只要引入了 Servlet 相关依赖,就可以使用过滤器。
拦截器:拦截器是 Spring 框架中的一部分,是 Spring MVC 框架的组件,依赖于 Spring 框架的上下文。
(2)作用范围
过滤器:过滤器的作用范围更广,它可以对所有的请求进行拦截,包括静态资源请求。它是在请求进入 Servlet 容器后,但在进入 Servlet 之前进行处理。
拦截器:拦截器主要作用于 Spring MVC 的请求处理流程,只能拦截 Spring MVC 控制器处理的请求,对静态资源请求不会进行拦截。它是在请求进入控制器之前、控制器处理请求之后以及视图渲染之前进行处理。
(3)实现方式
过滤器:过滤器需要实现 javax.servlet.Filter 接口,并重写 init、doFilter 和 destroy 方法。
拦截器:拦截器需要实现 org.springframework.web.servlet.HandlerInterceptor 接口,并重写 preHandle、postHandle 和 afterCompletion 方法。
(4)访问对象
过滤器:过滤器可以访问 ServletRequest 和 ServletResponse 对象,但无法直接访问 Spring 容器中的 Bean。
拦截器:拦截器除了可以访问 ServletRequest 和 ServletResponse 对象外,还可以访问 Spring 容器中的 Bean,因为它是 Spring 框架的一部分。
【二】适用场景
【1】过滤器
请求预处理:如字符编码转换、请求参数过滤等。
日志记录:记录所有请求的基本信息,包括请求 URL、请求时间等。
权限验证:对所有请求进行统一的权限验证,如判断用户是否登录。
【2】拦截器
控制器方法增强:在控制器方法执行前后添加额外的逻辑,如记录方法执行时间、进行权限细粒度验证等。
事务管理:在控制器方法执行前后开启和提交事务。
视图渲染前处理:对模型数据进行处理或添加额外的属性。
【三】使用案例
【1】过滤器使用案例
步骤 1:创建过滤器类
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;// 使用 @WebFilter 注解指定过滤的 URL 模式
@WebFilter(urlPatterns = "/*")
public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 初始化方法,在过滤器创建时调用System.out.println("MyFilter initialized");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {// 预处理逻辑System.out.println("Before request processing");// 放行请求chain.doFilter(request, response);// 后处理逻辑System.out.println("After request processing");}@Overridepublic void destroy() {// 销毁方法,在过滤器销毁时调用System.out.println("MyFilter destroyed");}
}
步骤 2:启用过滤器
在 Spring Boot 主类上添加 @ServletComponentScan 注解,以启用 @WebFilter 注解。
java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;@SpringBootApplication
@ServletComponentScan
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
【2】拦截器使用案例
步骤 1:创建拦截器类
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {// 在控制器方法执行前调用System.out.println("Before controller method execution");// 返回 true 表示继续执行后续流程,返回 false 则中断请求return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {// 在控制器方法执行后,视图渲染前调用System.out.println("After controller method execution, before view rendering");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {// 在请求处理完成后调用,包括视图渲染完成System.out.println("Request processing completed");}
}
步骤 2:配置拦截器
创建一个配置类,实现 WebMvcConfigurer 接口,并重写 addInterceptors 方法来注册拦截器。
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**") // 拦截所有请求.excludePathPatterns("/static/**"); // 排除静态资源请求}
}