# 基于 Spring 的手机验证码模块 **Repository Path**: zweirm/Spring-Based-SMS-Verification-Module ## Basic Information - **Project Name**: 基于 Spring 的手机验证码模块 - **Description**: 基于 Spring 的手机验证码模块 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-11-14 - **Last Updated**: 2022-05-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 基于 Spring 的手机验证码模块 本项目实现了基于 Spring 和 Redis 的手机验证码模块。在本模块中,后端利用了 Redis 特性实现了验证码定时过期的基本特性,也拥有基于配置项对验证码使用次数、验证码个数、验证码申请频率的扩展特性。 项目同时在前端进行了用户输入的逻辑验证,用过模块在前后台共同验证来保证逻辑正确性和模块安全性。 具体的可配置包括: + 验证码位数 (默认:6 位) + 单个验证码有效时间 (默认:120 秒) + 用户申请验证码频率 (默认:60 秒) + 单个验证码可用次数 (默认: 3 次) 在项目中配置文件中进行具体修改: ```yaml verify: digit: 6 alive-life: 120 alive-time: 60 valid-count: 3 ``` ## 技术选型 + 后台框架:Spring Boot + 缓存:Redis + 前端:Thymeleaf, Bootstrap ## 接口文档 ### 1. 获取手机验证码 |接口详情|| |:--|:--| |URL|`/requestCode`| |请求类型|POST| |请求参数|说明|类型|是否必须| |:--|:--|:--|:--| |`phone`|手机号码|`String`|是| |返回参数|说明|类型| |:--|:--|:--| |`当前 60 秒内已申请过验证码`|当前用户在 60 秒内已经申请过验证码|JSON| |`000000`(6 位数字验证码,以全 0 为示例)|系统所生成的手机验证码|JSON| ### 2. 验证手机验证码 |接口详情|| |:--|:--| |URL|`/verify`| |请求类型|POST| |请求参数|说明|类型|是否必须| |:--|:--|:--|:--| |`phone`|手机号码|`String`|是| |`code`|手机验证码|`String`|否| |返回参数|说明|类型| |:--|:--|:--| |`请先申请手机验证码`|当前用户未申请手机验证码|JSON| |`验证码输入错误`|用户提交的验证码与系统内部保存的不匹配,且尝试次数在 3 次以内|JSON| |`验证码使用次数超出限制`|用户提交的验证码与系统内部保存的不匹配,且尝试次数超过 3 次|JSON| |`验证码验证成功`|手机验证码通过验证|JSON| ### 3. 获取图形验证码 |接口详情|| |:--|:--| |URL|`/kaptcha`| |请求类型|GET| 该请求无请求参数。 该请求会以流形式生成图片。 ### 4. 验证图形验证码 |接口详情|| |:--|:--| |URL|`/imgVerify`| |请求类型|POST| |请求参数|说明|类型|是否必须| |:--|:--|:--|:--| |`verifyCodeActual`|用户提交的图形验证码|`String`|否| |返回参数|说明|类型| |:--|:--|:--| |`图形验证码有误`|用户提交的图形验证码与系统保存在 Session 中的验证码不匹配|JSON| |`图形验证码验证成功`|图形验证码通过验证|JSON| ### 5. 登录成功跳转 |接口详情|| |:--|:--| |URL|`/login`| |请求类型|GET| 该请求无请求参数。当所有登录逻辑验证成功时调用。 |返回参数|说明|类型| |:--|:--|:--| |`登录成功`|用户登录成功|JSON| 该接口当前只提供了返回登录成功提示 JSON 的功能,后续可根据具体需求进行修改。 ### 6. 无权限页面跳转 |接口详情|| |:--|:--| |URL|`/403`| |请求类型|GET| 该请求无请求参数。 |返回参数|说明|类型| |:--|:--|:--| |`/error/403`|403 错误页面|页面| ## 核心逻辑 由于单条验证码有获取频率的时间要求和有效期的时间要求两项,且时间不同。所以在模块中,对同一个手机号会存入两条数据来实现这样的功能。 + 对于申请频率时间要求,我们以 String 类型的 Redis 数据进行保存。存入手机号拼接 "A" 为键,值为 “UP”,并设置其有效时间,它存在即表示当前时间段内已申请过手机验证码; + 对于验证码有效期时间要求,我们以 Hash 类型的 Redis 数据进行保存。存入手机号拼接 "B" 为键。内部有两项 HashKey,分别是验证码和对应的已使用次数。它会在时间到期后销毁,也会在使用超过设定次数后被删除。 手机验证码获取和验证的基本流程如下: ![手机验证码获取逻辑](https://wx1.sinaimg.cn/mw690/9b98bf43ly1gwdzx1mrp1j20hh12179q.jpg) ![手机验证码验证逻辑](https://wx3.sinaimg.cn/mw690/9b98bf43ly1gwdzx1wsrej20y312hn5k.jpg)