spring boot 中最常用密码复杂度校验方式是 @pattern 注解配合正则表达式,要求含大小写字母、数字、特殊符号且长度8–16位;推荐正则:^(?=.[a-z])(?=.[a-z])(?=.d)(?=.[!@#$%^&*()_+-=[]{};':\"\\|,.?]).{8,16}$。

Spring Boot 中对密码复杂度做正则校验,最常用、最直接的方式是用 @Pattern 注解配合精心设计的正则表达式,在 DTO 或 Controller 参数上声明规则。它轻量、无需额外类,适合多数业务场景。
核心正则写法与说明
要强制密码包含大小写字母、数字、特殊符号,且长度 8–16 位,推荐正则如下:
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*()_+\-=\[\]{};':"\\|,.\/?]).{8,16}$- (?=.*[a-z]):确保至少一个英文小写字母
- (?=.*[A-Z]):确保至少一个英文大写字母
- (?=.*\d):确保至少一个数字(注意双反斜杠转义)
- (?=.*[!@#$%^&*...]):确保至少一个指定特殊字符(可根据实际策略增删)
- .{8,16}:总长度限制在 8 到 16 位之间
Controller 层直接使用示例
适用于简单接口,如修改密码:
@PostMapping("/user/modifyPassword")
@ResponseBody
public ResponseResult modifyPassword(
@NotBlank(message = "原密码不能为空") String oldPassword,
@NotBlank(message = "新密码不能为空")
@Pattern(
regexp = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[!@#$%&*]).{8,16}$",
message = "密码必须含大小写字母、数字、特殊符号,长度8-16位"
)
String newPassword
) {
return loginUserService.modifyPassword(oldPassword, newPassword);
}
⚠️ 注意:Java 字符串中反斜杠需双写,所以 d 写成 \d,[!@#$%&*] 中的 & 和 * 不需额外转义(在字符组内安全)。
DTO 实体类中复用更规范
当多个接口共用同一密码规则时,建议封装进 DTO,提升可维护性:
public class UserRegisterDTO {
@NotBlank(message = "用户名不能为空")
private String username;
@NotBlank(message = "密码不能为空")
@Pattern(
regexp = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[!@#$%^&*]).{8,16}$",
message = "密码强度不足:需含大小写字母、数字、特殊符号,长度8–16位"
)
private String password;
}
Controller 中只需加 @Valid 即可触发校验:
@PostMapping("/register")
public ResponseResult register(@Valid @RequestBody UserRegisterDTO dto) { ... }
补充建议:正则之外的关键增强点
仅靠正则不够全面,生产环境建议叠加以下检查:
- 排除常见弱密码(如 "123456"、"password"),可用内存 Set 或 Redis 缓存字典实时比对
- 禁止密码包含用户名、邮箱前缀等上下文信息,需在 Service 层结合用户数据做语义校验
- 避免纯键盘序列(如 "qwerty"、"asdfgh")和重复字符(如 "aaaaaa"),这类需自定义校验器(实现 ConstraintValidator)
- 首次设置或重置密码时,建议额外检查是否与历史密码重复,需查库比对加密后的旧密码哈希值











