基于阿里云号码认证服务的 Spring Boot 短信验证码登录方案
一、代码原理及其实现
原本是用 session 的,但是 session 默认存在服务器内存,当请求落到不同的服务器时,session 不共享。所以使用 Redis + Token,多台服务器都可以访问同一个 Redis,无需粘性 Session。
登录功能的逻辑大概是:点击发送验证码时,请求走 @PostMapping("code"),sendCode 方法先把验证码存入 Redis,并设置有效期(2 分钟)。用户输入验证码登录时,请求走 @PostMapping("/login"),login 方法取出验证码进行比对,如果一致,则生成 Token,把用户信息存入 Redis(用 Token 作为 Key,结构是 Hash),并返回 Token 给前端;前端每次请求都带 Token,拦截器从 Redis 获取用户信息并续命,同时把用户信息存入 ThreadLocal 供业务使用。
1. 号码认证依赖
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>dypnsapi20170525</artifactId>
<version>2.0.0</version>
</dependency>
2. Controller 层
package com.hmdp.controller;
import cn.hutool.core.bean.BeanUtil;
import com.hmdp.dto.LoginFormDTO;
import com.hmdp.dto.Result;
import com.hmdp.dto.UserDTO;
import com.hmdp.entity.User;
import com.hmdp.entity.UserInfo;
import com.hmdp.service.IUserInfoService;
import com.hmdp.service.IUserService;
import com.hmdp.utils.UserHolder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
@Slf4j
@RestController
@RequestMapping("/user")
{
IUserService userService;
Result {
userService.sendCode(phone, session);
}
Result {
userService.login(loginForm, session);
}
}


