抽象类用于封装Spring Security过滤器链的通用拦截逻辑,提供shouldFilter和authenticate等protected abstract方法供子类实现,基类统一处理执行顺序与异常兜底,确保线程安全。

在 Java 的 Spring Security 中,抽象类常用于封装过滤器链中通用的拦截逻辑,避免重复代码。自定义安全过滤器若需统一处理认证前/后的基础行为(如日志记录、请求校验、响应头设置),可定义一个抽象基类,把共性逻辑抽出来,再由具体子类实现差异化部分(如 token 解析方式、权限判定规则)。
抽象基类定义核心拦截骨架
抽象类不直接继承 OncePerRequestFilter,而是作为其子类的父类,提供模板方法。关键点在于:用 protected abstract 方法留出钩子,让子类决定“何时拦截”和“如何验证”,而基类控制“执行顺序”和“异常兜底”。例如:
- 定义
shouldFilter(HttpServletRequest)抽象方法,由子类判断是否对该请求生效(如只处理以/api/**开头的路径) - 定义
authenticate(HttpServletRequest)抽象方法,子类负责从请求中提取凭证并尝试认证(如解析 JWT、读取 Basic Auth 头) - 基类在
doFilterInternal中统一调用这两个方法,并处理空认证、认证失败、已认证跳过等流程
子类只需关注业务逻辑,不重复写流程控制
具体过滤器继承该抽象类后,不再需要重写整个过滤逻辑。比如实现一个 JWT 过滤器,只需:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 重写
shouldFilter:返回request.getRequestURI().startsWith("/api/") - 重写
authenticate:从Authorization头取 token,校验签名与有效期,构建UsernamePasswordAuthenticationToken - 无需关心
SecurityContextHolder设置、异常转译或链式调用——这些已在基类中完成
配合 SecurityConfig 注册时保持类型灵活性
在配置类中注册过滤器时,直接 new 具体子类即可,Spring 容器能正常识别其为 Filter 类型。抽象基类本身不被注册,也不需要加 @Component。若多个子类有不同顺序要求,可在 addFilterBefore 或 addFilterAfter 中按需插入,不影响基类设计。
立即学习“Java免费学习笔记(深入)”;
注意线程安全与状态隔离
抽象类中不应保存请求相关状态(如缓存 token 解析结果到字段),因为过滤器是单例,多线程共享。所有状态必须限定在方法内(如局部变量)或通过 ThreadLocal 显式管理。若需复用工具类(如 JWT 解析器),应注入为 final 字段,确保无状态。

















