【Spring Boot 过滤器】

06-01 1219阅读

文章目录

  • 前言
  • 一、什么是过滤器 Filter?
  • 二、Spring Boot 中使用 Filter 的方式
      • 1. 使用 `@Component` 注解
      • 2. 使用 `FilterRegistrationBean` 显式注册
      • 三、自定义过滤器示例
        • 1. 引入必要依赖
        • 2. 创建一个自定义 Filter
        • 3. 使用 FilterRegistrationBean 显式注册
        • 四、多个 Filter 的执行顺序
        • 五、Filter 与 Interceptor 和 AOP 的区别
        • 六、过滤器实现登录校验
        • 总结

          前言

          在Web开发中,我们常常需要对请求做一些统一的处理,例如:请求日志记录、权限验证、跨域处理等。Spring Boot 中除了可以使用拦截器(Interceptor)和AOP,还可以使用过滤器(Filter)。


          一、什么是过滤器 Filter?

          Filter 是 Servlet 规范中的一个组件,用于在请求到达 Servlet 之前或响应返回客户端之前进行预处理或后处理。它可以用来实现:

          • 请求日志记录
          • 用户认证与权限检查
          • 参数过滤与包装
          • 编码设置
          • 防止 XSS 攻击等

            它的核心接口是 javax.servlet.Filter。


            二、Spring Boot 中使用 Filter 的方式

            在 Spring Boot 中,有两种方式注册 Filter:

            1. 使用 @Component 注解

            直接在自定义的 Filter 类上加上 @Component 注解即可自动注册到 Spring 容器中。

            2. 使用 FilterRegistrationBean 显式注册

            可以通过创建一个 FilterRegistrationBean 的 Bean,来手动注册过滤器,并设置过滤路径、顺序等信息。


            三、自定义过滤器示例

            1. 引入必要依赖

            Spring Boot 的 Web 项目只需要依赖如下 starter(通常已包含在创建项目时):

                org.springframework.boot
                spring-boot-starter-web
            
            

            2. 创建一个自定义 Filter

            import jakarta.servlet.*;
            import jakarta.servlet.http.HttpServletRequest;
            import org.springframework.stereotype.Component;
            import java.io.IOException;
            @Component
            public class MyLogFilter implements Filter {
                @Override
                public void init(FilterConfig filterConfig) throws ServletException {
                    System.out.println("MyLogFilter 初始化...");
                }
                @Override
                public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                        throws IOException, ServletException {
                    HttpServletRequest req = (HttpServletRequest) request;
                    System.out.println("请求路径:" + req.getRequestURI());
                    // 放行请求
                    chain.doFilter(request, response);
                }
                @Override
                public void destroy() {
                    System.out.println("MyLogFilter 销毁...");
                }
            }
            

            运行项目访问接口时,你会在控制台看到日志输出。


            3. 使用 FilterRegistrationBean 显式注册

            如果你想更细粒度地控制 Filter,例如:设置过滤路径或顺序,可以使用如下方式:

            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 registerLogFilter() {
                    FilterRegistrationBean registrationBean = new FilterRegistrationBean();
                    registrationBean.setFilter(new MyLogFilter());
                    registrationBean.addUrlPatterns("/api/*"); // 指定过滤路径
                    registrationBean.setOrder(1); // 设置执行顺序,值越小优先级越高
                    return registrationBean;
                }
            }
            

            四、多个 Filter 的执行顺序

            如果你注册了多个 Filter,执行顺序取决于:

            • 使用 @Component 的方式时,默认顺序不确定(但可以使用 @Order 注解控制顺序)
            • 使用 FilterRegistrationBean 的方式时,可以通过 setOrder() 方法设置优先级

              示例:

              @Component
              @Order(2)
              public class SecondFilter implements Filter {
                  // ...
              }
              

              五、Filter 与 Interceptor 和 AOP 的区别

              特性/维度FilterInterceptor(拦截器)AOP(切面)
              所属层Servlet 规范Spring MVCSpring AOP
              作用对象HttpServletRequestController 方法任意 Bean 方法
              控制范围Servlet 全请求生命周期请求到达 Controller 前后方法执行前后
              应用场景日志、权限、跨域、编码处理权限校验、接口日志等事务、缓存、日志等通用逻辑

              六、过滤器实现登录校验

              拦截所有 /admin/** 路径下的请求,如果请求头中没有携带 token 参数,则返回 401。

              @Component
              @Order(1)
              public class AuthFilter implements Filter {
                  @Override
                  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                          throws IOException, ServletException {
                      HttpServletRequest req = (HttpServletRequest) request;
                      HttpServletResponse resp = (HttpServletResponse) response;
                      String uri = req.getRequestURI();
                      if (uri.startsWith("/admin/")) {
                          String token = req.getHeader("token");
                          if (token == null || token.isEmpty()) {
                              resp.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                              resp.getWriter().write("401 Unauthorized");
                              return;
                          }
                      }
                      chain.doFilter(request, response);
                  }
              }
              

              访问 /admin/** 路径时,必须在请求头中携带 token。


              总结

              • Filter 的概念和作用
              • 使用 @Component 和 FilterRegistrationBean 的两种注册方式
              • 多个过滤器的顺序控制
              • Filter 与 Interceptor、AOP 的区别
              • 实际案例:请求日志、登录校验
              【Spring Boot 过滤器】
              (图片来源网络,侵删)
              【Spring Boot 过滤器】
              (图片来源网络,侵删)
              【Spring Boot 过滤器】
              (图片来源网络,侵删)
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码