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

标题: Springboot焦点:过滤器 [打印本页]

作者: 海哥    时间: 2025-2-17 01:22
标题: Springboot焦点:过滤器
☆ 什么是过滤器

   过滤器(Filter)是在Web应用程序中用来拦截和处理哀求/响应的组件。它们按照肯定的次序链式地处理每个传入的HTTP哀求,并可以在哀求被处理前或响应被发送回客户端后执行某些逻辑。
常用于做权限查抄认证,记载日志操纵、拦截过滤哀求、敏感数据处理,同一编码处理等。
  ☆ 过滤器的生命周期


  1. @Override
  2. public void init(FilterConfig filterConfig) throws ServletException {
  3.     // 执行初始化逻辑,如读取配置参数等
  4. }
复制代码

  1. @Override
  2. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  3.         throws IOException, ServletException {
  4.     // 在这里添加过滤逻辑
  5.     try {
  6.         // 可选:预处理请求
  7.         
  8.         // 继续调用下一个过滤器或目标资源
  9.         chain.doFilter(request, response);
  10.         
  11.         // 可选:后处理响应
  12.     } catch (Exception e) {
  13.         // 异常处理逻辑
  14.     }
  15. }
复制代码

  1. @Override
  2. public void destroy() {
  3.     // 执行清理逻辑,如关闭资源等
  4. }
复制代码
☆ 使用场景

☆ 如何使用
在Springboot中,实现过滤器的方式有多种,如何使用取决于本身的习惯偏好,以下是几种常见实现方式:

  1. import javax.servlet.*;
  2. import java.io.IOException;
  3. @Slf4j
  4. @Component
  5. @Order(1)
  6. public class MyCustomFilter implements Filter {
  7.     @Override
  8.     public void init(FilterConfig filterConfig) throws ServletException {
  9.          // 初始化逻辑
  10.         log.info("filter1 init……");
  11.     }
  12.     @Override
  13.     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  14.             throws IOException, ServletException {
  15.         log.info("=================:{}", "在这里添加过滤逻辑");        
  16.         // 继续调用下一个过滤器或目标资源
  17.         chain.doFilter(request, response);
  18.     }
  19.     @Override
  20.     public void destroy() {
  21.         // 清理逻辑
  22.         log.info("filter1 destroy……");
  23.     }
  24. }
复制代码
注册过滤器
可以通过配置类手动注册这个过滤器,或者使用@Component注解让Spring主动检测到它,过滤器的次序可以通过注解@Order指定。

  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 CustomOncePerRequestFilter extends OncePerRequestFilter {
  8.     @Override
  9.     protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
  10.             throws ServletException, IOException {
  11.         // 自定义逻辑
  12.         super.doFilterInternal(request, response, filterChain);
  13.     }
  14. }
复制代码

基于注解@WebFilter 和 @ServletComponentScan
起首必要在主应用程序类或启动类上添加启用@ServletComponentScan注解,用以扫描并注册带有@WebFilter注解的组件。
示例代码:编写过滤器实现Filter
  1. import javax.servlet.annotation.WebFilter;
  2. import javax.servlet.annotation.WebInitParam;
  3. import javax.servlet.Filter;
  4. import javax.servlet.FilterChain;
  5. import javax.servlet.FilterConfig;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.ServletRequest;
  8. import javax.servlet.ServletResponse;
  9. import java.io.IOException;
  10. @WebFilter(urlPatterns = "user/*", filterName = "filter1", initParams = @WebInitParam(name = "paramName", value = "paramValue"))
  11. @Slf4j
  12. public class UserFilter implements Filter {
  13.     @Override
  14.     public void init(FilterConfig filterConfig) throws ServletException {
  15.         // 初始化逻辑
  16.         log.info("filter1 init……");
  17.     }
  18.     @Override
  19.     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  20.             throws IOException, ServletException {
  21.         // 过滤逻辑
  22.         HttpServletRequest request1 = (HttpServletRequest) servletRequest;
  23.         String token = request1.getHeader("token");
  24.         log.info("token值:{}", token);
  25.         if (token != null) {
  26.             //该方法执行后直接运行至下一个过滤器
  27.             chain.doFilter(request, response);
  28.         } else {
  29.             log.info("错误处理:{}", "非法用户");
  30.         }
  31.     }
  32.     @Override
  33.     public void destroy() {
  34.         // 清理逻辑
  35.         log.info("filter1 destroy……");
  36.     }
  37. }
复制代码
启用扫描:
  1. import org.springframework.boot.SpringApplication;
  2. import org.springframework.boot.autoconfigure.SpringBootApplication;
  3. import org.springframework.boot.web.servlet.ServletComponentScan;
  4. @SpringBootApplication
  5. @ServletComponentScan //过滤器扫描
  6. public class MyApplication {
  7.     public static void main(String[] args) {
  8.         SpringApplication.run(MyApplication.class, args);
  9.     }
  10. }
复制代码

  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<MyCustomFilter> loggingFilter(){
  8.         FilterRegistrationBean<MyCustomFilter> registrationBean = new FilterRegistrationBean<>();
  9.         registrationBean.setFilter(new MyCustomFilter());
  10.         registrationBean.addUrlPatterns("/api/*"); // 指定过滤器适用的URL模式
  11.         registrationBean.setOrder(1); // 设置过滤器的优先级
  12.         return registrationBean;
  13.     }
  14. }
复制代码
☆ 参考:文章 FC464782123

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




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