过滤器和拦截器

在 Spring Boot 项目中,过滤器和拦截器是两种常用的请求处理机制,它们都可以实现对请求的预处理和后处理,但在使用场景和实现原理上有明显区别。以下是详细说明(只有一个框架里面的逻辑代码需要自己根据自己的项目完成):


逻辑代码可以成这个张图来实现是一种解决问题的方法
在这里插入图片描述

一、过滤器的使用 (Filter)

属于 Servlet 规范,作用于 Web 容器层面,可以拦截所有请求(包括静态资源)。

1. 创建过滤器
import javax.servlet.*;
import java.io.IOException;


public class CustomFilter implements Filter {
    
    @Override
    public void init(FilterConfig filterConfig) {
        // 初始化逻辑
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
        throws IOException, ServletException {
        // 请求处理前的逻辑(如日志、编码设置)
        System.out.println("Before Filter");

        // 放行请求到后续过滤器或 Servlet
        chain.doFilter(request, response);

        // 响应处理后的逻辑
        System.out.println("After Filter");
    }

    @Override
    public void destroy() {
        // 销毁逻辑
    }
}
2. 注册过滤器

方式 1:使用 @Component + @ServletComponentScan

@WebFilter(urlPatterns = "/*")
public class CustomFilter implements Filter { ... }

// 启动类添加扫描
@ServletComponentScan
@SpringBootApplication
public class Application { ... }

方式 2:通过 FilterRegistrationBean 动态注册

@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean<CustomFilter> registerFilter() {
        FilterRegistrationBean<CustomFilter> bean = new FilterRegistrationBean<>();
        bean.setFilter(new CustomFilter());
        bean.addUrlPatterns("/*");
        bean.setOrder(1); // 设置执行顺序
        return bean;
    }
}

二、拦截器的使用 (Interceptor)

属于 Spring MVC 框架,作用于 Controller 层面,只能拦截 Controller 请求。

1. 创建拦截器
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class CustomInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        // 请求处理前逻辑(如权限校验)
        System.out.println("Before Controller");
        return true; // 返回 false 会中断请求
    }


}
2. 注册拦截器
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new CustomInterceptor())
                .addPathPatterns("/api/**") // 拦截路径
                .excludePathPatterns("/api/public"); // 排除路径
    }
}

三、过滤器 vs 拦截器的区别

特性过滤器 (Filter)拦截器 (Interceptor)
归属规范Servlet 规范 (javax.servlet)Spring MVC 框架 (org.springframework.web)
作用范围所有请求(包括静态资源)仅 Controller 请求
执行时机在拦截器之前执行在过滤器之后、Controller 方法前后执行
依赖容器依赖 Web 容器(如 Tomcat)依赖 Spring 容器
获取 Bean无法直接注入 Spring Bean可以直接使用 @Autowired 注入 Bean
控制粒度粗粒度(基于 URL)细粒度(可获取处理方法的元数据)
异常处理无法直接处理 Controller 异常可以通过 @ExceptionHandler 处理异常

四、选择建议

  • 过滤器:适合处理与业务无关的通用逻辑(如请求日志、全局编码设置、跨域处理)。
  • 拦截器:适合处理与业务相关的逻辑(如权限验证、参数校验、响应数据加工)。

五、执行顺序示例

请求 -> Filter1 -> Filter2 -> Interceptor -> Controller
响应 <- Filter2 <- Filter1 <- Interceptor

通过合理组合过滤器和拦截器,可以实现灵活的请求处理流程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值