高健壮性入参拦截的核心是“判得准、拦得早、反馈清、可追溯”,需覆盖数据类型、格式规范、业务语义、上下文一致性四层校验,统一schema管理,主动识别合法但异常数据,并分层部署拦截与可观测性支撑。

高健壮性的入参拦截逻辑,核心不是“拦得严”,而是“判得准、拦得早、反馈清、可追溯”。它要同时防住两类问题:一类是明显非法的输入(如空值、超长、类型错),另一类是表面合法但业务上明显异常的数据(比如一串“111111111111111”作为手机号)。下面从四个关键维度展开说明。
覆盖四层校验维度
单靠非空+长度检查远远不够。真正健壮的校验需同步覆盖:
- 数据类型:用白名单机制判断字符集,比如邮箱只允许字母、数字、@、.、-;避免用黑名单排除已知危险字符
- 格式规范:手机号走正则匹配(如^1[3-9]\d{9}$),身份证号用国标校验码算法,而非仅看长度
- 业务语义:比如“下单数量”不能是负数,“生日日期”不能晚于今天,“昵称”不能含平台禁用词或纯重复字符(如“aaaaaa”、“111111”)
- 上下文一致性:例如用户修改密码时,新旧密码不能相同;提交订单时,收货地址省份必须在系统支持列表内
用结构化 Schema 统一入口
避免在每个 Controller 方法里手写 if 判断。推荐使用 JSON Schema 或框架原生校验能力统一管理规则:
- Spring Boot 中配合
@Valid+ 自定义@Constraint注解,把“非纯数字昵称”“非重复手机号”等规则封装成可复用的验证器 - 对复杂对象(如嵌套的 address 对象),启用递归校验,确保子字段也满足 province 必填、detail 不超 100 字等约束
- 所有校验失败统一返回标准错误结构,包含字段名、错误码、中文提示,不暴露内部实现细节
主动识别“合法但异常”的数据
这类数据能过基础校验,却会污染数据库、干扰对账、误导运营。拦截逻辑需额外加一层启发式检测:
- 对字符串字段,检查是否为全相同字符(
str.equals(String.valueOf(str.charAt(0)).repeat(str.length()))) - 检测是否为典型占位值,如“123456”、“test123”、“请输入手机号”、“暂无”、“null”、“undefined”
- 对数值型字段,设置业务合理区间(如年龄 1~120,金额 ≥ 0),拒绝明显离谱值
- 对敏感字段(如手机号、邮箱),增加轻量级格式+语义双校验,例如“11111111111”符合手机号长度和正则,但应被标记为异常并拦截
分层拦截 + 可观测性支撑
校验不是越靠前越好,而要分层部署、各司其职:
- 前端层:做友好提示(如实时校验手机号格式),但不可信,仅作体验优化
- 网关/Filter 层:做统一鉴权、基础非空与长度拦截,快速拒绝明显恶意请求
-
Controller 入口层(AOP 方式):执行完整业务校验,包括自定义注解(如
@VerifyParam(regex = VerifyRegexEnum.MOBILE))、重复值检测、上下文比对 - 日志与监控:记录每次拦截的字段、原始值、拦截原因、请求来源 IP 和 traceId;对高频异常值(如“11111111111”出现超 10 次/小时)自动触发告警











