ToB企服应用市场:ToB评测及商务社交产业平台

标题: Spring Boot 框架下的过滤器 [打印本页]

作者: 小秦哥    时间: 2025-1-7 17:41
标题: Spring Boot 框架下的过滤器
1. 过滤器的基础概念

1.1 什么是过滤器?


1.2 过滤器的焦点方法

javax.servlet.Filter 接口定义了以下三个方法:


2. Spring Boot 项目中如何使用过滤器

在 Spring Boot 中,可以通过以下两种方式注册过滤器:
2.1 自动注册过滤器

通过 @Component 注解将过滤器注册为 Spring Bean,Spring Boot 会自动加载并将其添加到过滤器链中。
示例代码:
  1. import org.springframework.stereotype.Component;
  2. import javax.servlet.*;
  3. import javax.servlet.http.HttpServletRequest;
  4. import java.io.IOException;
  5. @Component
  6. public class MyFilter implements Filter {
  7.     @Override
  8.     public void init(FilterConfig filterConfig) {
  9.         System.out.println("过滤器初始化");
  10.     }
  11.     @Override
  12.     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  13.             throws IOException, ServletException {
  14.         HttpServletRequest httpRequest = (HttpServletRequest) request;
  15.         System.out.println("请求路径:" + httpRequest.getRequestURI());
  16.         chain.doFilter(request, response); // 继续传递请求
  17.     }
  18.     @Override
  19.     public void destroy() {
  20.         System.out.println("过滤器销毁");
  21.     }
  22. }
复制代码
解释:


2.2 手动注册过滤器

通过 FilterRegistrationBean 手动注册过滤器,可以指定 URL 匹配规则和执行顺序。
示例代码:
  1. import org.springframework.boot.web.servlet.FilterRegistrationBean;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.Configuration;
  4. @Configuration
  5. public class FilterConfig {
  6.     @Bean
  7.     public FilterRegistrationBean<MyFilter> registerMyFilter() {
  8.         FilterRegistrationBean<MyFilter> registrationBean = new FilterRegistrationBean<>();
  9.         registrationBean.setFilter(new MyFilter()); // 注册过滤器
  10.         registrationBean.addUrlPatterns("/api/*");  // 仅拦截 /api/ 开头的请求
  11.         registrationBean.setOrder(1);
  12.               // 设置执行顺序,值越小优先级越高
  13.         return registrationBean;
  14.     }
  15. }
复制代码
解释:


3. 使用 Spring 提供的扩展过滤器

Spring 提供了一个扩展类 OncePerRequestFilter,它是对标准过滤器的加强,用于确保在一次请求中只执行一次过滤逻辑(防止重复过滤)。
示例代码:
  1. import org.springframework.web.filter.OncePerRequestFilter;
  2. import javax.servlet.FilterChain;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import java.io.IOException;
  7. public class MyOncePerRequestFilter extends OncePerRequestFilter {
  8.     @Override
  9.     protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
  10.             throws ServletException, IOException {
  11.         System.out.println("请求路径:" + request.getRequestURI());
  12.         filterChain.doFilter(request, response); // 继续传递请求
  13.     }
  14. }
复制代码
注册方式: 可以通过 @Component 或 FilterRegistrationBean 注册,方式与标准过滤器一致。
解释:

4. 过滤器的执行顺序 

在 Spring Boot 中,多个过滤器的执行顺序由以下规则决定: 
4.1 自动注册的过滤器

示例:
  1. @Component
  2. @Order(1) // 优先级最高
  3. public class FirstFilter implements Filter {
  4.     ...
  5. }
  6. @Component
  7. @Order(2) // 优先级次之
  8. public class SecondFilter implements Filter {
  9.     ...
  10. }
复制代码

4.2 手动注册的过滤器

示例:
  1. registrationBean.setOrder(1);
复制代码


5. 常见过滤器应用场景



6. 注意事项


7.一个请求在整个Spring Boot Web 应用中的处理流程

以一个常见的 Spring Boot Web 应用为例,处理一个请求大概会经过多个环节:
  1. [客户端请求]
  2.    ↓
  3. [Filter1 -> Filter2 -> ... -> FilterN] // 过滤器链
  4.    ↓
  5. [Servlet Container] // DispatcherServlet
  6.    ↓
  7. [Spring MVC 拦截器(Interceptor)] // 可选
  8.    ↓
  9. [Controller / RestController 方法]
  10.    ↓
  11. [视图解析或返回响应]
  12.    ↑
  13. [FilterN -> ... -> Filter1] // 响应回程,也可以在过滤器里做后置处理
  14.    ↑
  15. [客户端接收响应]
复制代码

 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4