『博客开发日记』之优化发送验证码的相关接口

本文最后更新于 2026年1月24日 晚上

优化验证码发送的接口


前言

由于先前的接口设计有缺陷

导致发送验证码的方式多样化时会需要一堆接口

先前就设计了有关验证码发送的接口就有五个

现在将五个接口改为一个

后端只需要验证前端发来的参数account和type(手机号/邮箱,登录/注册/修改密码)

然后通过判断类型来发送不同类型的验证码

包含 @ → 邮箱 符合 1[3-9]\d{9} → 手机号 其他 → 返回错误提示

前端的工作只需要传account和type两个参数就行了

修改前端有关接口接受的代码


验证码登录页面修改


忘记密码页面修改


注册页面修改


修改SendCodeDto,为前端传参创造两个字段


修改服务类中发送验证码接口,去除掉先前的这么多个发送验证码方法,统一为有关方法实现

同时做出多重判断防止前端传入错误或空的参数,也防止恶意攻击者绕过前端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//统一发送验证码接口
@Override
public ResponseResult sendCode(SendCodeDto dto)
{
//验证必填参数
if (!StringUtils.hasText(dto.getAccount())) {
return ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR, "账号不能为空");
}
if (!StringUtils.hasText(dto.getType())) {
return ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR, "验证码类型不能为空");
}

String account = dto.getAccount().trim();
String type = dto.getType().toLowerCase();

//验证类型的有效性
if (!type.equals("login") && !type.equals("register") && !type.equals("forgot_password")) {
return ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR, "验证码类型无效");
}

//判断登录类型(邮箱或手机号)
String channel;
if (account.contains("@")) {
//包含@符号,判断为邮箱
channel = "email";
} else if (account.matches("^1[3-9]\\d{9}$")) {
//符合手机号格式
channel = "phone";
} else {
return ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR, "请输入正确的邮箱或手机号");
}

//判断是否需要判断账号已存在(登录和忘记密码需要,注册不需要)
boolean needAccountExists = !type.equals("register");

return sendVerificationCode(account, channel, type, needAccountExists);
}


PS:该系列只做为作者学习开发项目做的笔记用

不一定符合读者来学习,仅供参考


预告

后续会记录博客的开发过程

每次学习会做一份笔记来进行发表

“一花一世界,一叶一菩提”


版权所有 © 2025 云梦泽
欢迎访问我的个人网站:https://hgt12.github.io/


『博客开发日记』之优化发送验证码的相关接口
http://example.com/2026/01/22/『博客开发日记』之优化发送验证码的相关接口/
作者
云梦泽
发布于
2026年1月22日
更新于
2026年1月24日
许可协议