阿里云agent安全中心是全新安全框架下ai agent一体化防御平台,以agent资产为视角,覆盖开发态与运行态全生命周期防护,具备资产自动发现、血缘图谱构建、供应链审计、无代理漏洞扫描等核心能力。

直接在缓存访问链路中捕获特定运行时异常,是构建穿透防护层的关键切入点。重点不是泛泛拦截所有异常,而是识别并响应那些明确指向“数据根本不存在”的信号,从而阻断无效请求向数据库的持续冲击。
识别可捕获的穿透相关异常类型
并非所有异常都适合用于穿透判定。应聚焦以下几类有业务语义的运行时异常:
- 空指针异常(NullPointerException):当缓存未命中后,数据库查询返回 null,而代码未做判空就直接调用对象方法时抛出。这往往暴露了“查无此数据”却未缓存空值的问题
- 自定义业务异常(如 UserNotFoundException、ProductNotExistException):比空值更明确,是服务层主动抛出的“数据不存在”信号,最适合作为穿透拦截依据
- MyBatis 的 BindingException 或 TooManyResultsException:说明 SQL 执行逻辑与预期不符,例如参数传入非法 ID 导致查询条件失效,也属于穿透诱因
在 Spring Boot 中实现异常驱动的防护逻辑
利用 @ControllerAdvice + @ExceptionHandler 可集中处理这些异常,并触发防护动作:
- 对 UserNotFoundException 这类明确异常,在 handler 中立即向 Redis 写入一个带短 TTL(如 60 秒)的空标记,例如 SET user:123456 "__NULL__" EX 60
- 捕获 NullPointerException 时,需结合当前请求上下文(如 URL 路径、参数名)判断是否属于高风险穿透场景(如 /user/{id} 接口),再决定是否写空缓存
- 避免在异常处理器中执行耗时操作(如远程调用、复杂计算),防止拖慢整个错误响应链路
配合缓存注解增强防御闭环
Spring 的 @Cacheable 默认不处理 null 返回值,需主动配置:
- 使用 unless = "#result == null" 会跳过缓存,反而加剧穿透。应改为 unless = "#result instanceof NullValue",并让 service 层在查无结果时返回封装好的 NullValue 对象
- 在 @Cacheable 方法内手动捕获数据库层异常,将异常转化为统一的空响应对象,确保缓存层能稳定写入
- 搭配 @CachePut 在更新操作后强制刷新缓存,避免因缓存污染导致误判为“不存在”
异常日志与动态熔断联动
高频出现的穿透相关异常本身是重要信号:
- 对同一 key 在 1 分钟内触发 5 次 UserNotFoundException,自动将其加入布隆过滤器的“已确认不存在”集合,并记录到监控平台
- 当某类异常 QPS 突增超过阈值(如每秒 100 次),触发限流规则,对对应接口路径返回 429,而非继续走缓存-数据库链路
- 将异常类型、key、时间戳写入 Kafka,供离线任务分析穿透模式(如固定前缀的非法 ID),用于优化前端校验或网关规则










