抽象类auditloginterceptor适合定义安全审计日志通用模板,封装时间、ip、耗时等共性逻辑,通过模板方法executewithaudit编排流程,子类仅需实现操作主体、类型等抽象方法,并结合spring aop无侵入拦截。

在 Java 中,抽象类适合定义系统安全审计日志的通用拦截模板——它能封装日志记录的共性逻辑(如时间、操作人、IP、操作类型、结果状态),同时把具体业务行为(如“谁在什么接口做了什么操作”)留给子类实现。
抽象基类定义统一日志结构与拦截骨架
定义一个抽象类(如 AuditLogInterceptor),声明抽象方法获取关键审计字段,并在模板方法中组装、校验、落库或发消息:
-
必须由子类提供:操作主体(
getOperator())、资源标识(getResourceId())、操作类型(getOperationType())、业务上下文(getBusinessContext()) - 基类统一处理:自动记录当前时间、客户端 IP(从 Request 获取)、执行耗时、是否成功(try-catch 包裹业务逻辑后判断)、日志唯一 ID
-
模板方法模式:定义
executeWithAudit()方法,按“前置采集→执行业务→后置记录→异常补录”流程编排,子类只需调用该方法并实现抽象方法即可
结合 Spring AOP 实现无侵入式拦截
抽象类本身不负责切面织入,但可作为 AOP 增强的逻辑载体。例如:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 定义一个 @Aspect 切面,匹配需审计的 Controller 方法(如加了
@NeedAudit注解的方法) - 切面中实例化具体的审计子类(如
UserManagementAudit),调用其executeWithAudit() - 子类构造时传入当前
HttpServletRequest和JoinPoint,用于提取用户身份、请求参数、目标方法等信息
子类聚焦业务语义,不重复写日志模板
每个业务场景继承抽象类,只关心“这次审计要表达什么”。例如:
-
修改用户密码:重写
getOperationType()返回"UPDATE_PASSWORD",getBusinessContext()返回脱敏后的账号名 -
导出敏感报表:
getResourceId()返回报表编码,getOperator()从 SecurityContext 获取当前 Subject -
避免硬编码字段:操作类型建议用枚举(
AuditOperation.UPDATE_PASSWORD),资源类型也做标准化(如ResourceType.USER)
增强可扩展性与合规性
抽象类可预留钩子,支撑审计升级需求:
- 添加
shouldSkipAudit()默认返回 false,子类可按条件跳过低风险操作(如健康检查接口) - 提供
enrichExtraFields()抽象方法,允许子类注入自定义字段(如“审批单号”“关联工单 ID”)到日志 JSON 中 - 日志实体统一继承
AuditLogEntry基类,包含标准字段 + Mapextra,便于后续对接 SIEM 或满足等保日志留存要求
不复杂但容易忽略的是:抽象类要明确区分“必须实现”和“可选覆盖”,避免子类误改核心流程;日志内容需脱敏设计(如手机号掩码在基类统一处理),不能依赖子类自觉。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










