前一篇例子讲到在发送验短信或者邮箱验证码的时候,生成验证码的同时在redis里面保存了一份,同时避免频繁发送验证码。
把验证码存到redis里面 检验验证码的时候就是检查前端传过来的code和redis里的code是否相等。
//Controller层
@ApiOperation(value = "检查验证码(L)")
@ApiImplicitParam(name = "param", value = "校验验证码参数", required = true, dataType = "CheckCodeParam", paramType = "body")
@PostMapping("check_code")
public ResponseData checkCode(@RequestBody @Valid CheckCodeParam param, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return errorMsg(bindingResult);
}
return ResponseData.res(commonService.checkCode(param.getType(), param.getPhone(), param.getCode()), null);
}
//Service层
@Override
public ApiResult checkCode(Integer type, String phoneOrEmail, String code) {
String prefix;
if (SendCodeType.REGISTER.ordinal() == type) {
prefix = RedisKeyPrefix.USER_REGISTER_PREFIX + phoneOrEmail;
} else if (SendCodeType.FORGET_PWD.ordinal() == type) {
prefix = RedisKeyPrefix.USER_FORGET_PWD_PREFIX + phoneOrEmail;
} else if (type.equals(SendCodeType.BIND.ordinal())) {
prefix = RedisKeyPrefix.USER_BIND_PHONE_PREFIX + phoneOrEmail;
} else {
prefix = RedisKeyPrefix.USER_UPDATE_PREFIX + phoneOrEmail;
}
if (!code.equals(redisTemplate.opsForHash().get(prefix, "code"))) {
throw new BusinessException(ApiResult.UN_CORRECT_VERIFY_CODE);
}
return ApiResult.SUCCESS;
}
redis前缀常量类
public class RedisKeyPrefix {
/**
* 用户登录token
*/
public static final String LOGIN_TOKEN_KEY_PREFIX = "user:login:";
/**
* 注册验证码
*/
public static final String USER_REGISTER_PREFIX = "user:register:code:";
/**
* 忘记密码验证码
*/
public static final String USER_FORGET_PWD_PREFIX = "user:forgetPwd:code:";
/**
* 修改密码
*/
public static final String USER_UPDATE_PREFIX = "user:updatePwd:code:";
/**
* 绑定手机号
*/
public static final String USER_BIND_PHONE_PREFIX = "user:bindPhone:code:";
/**
* 提醒发货次数
*/
public static final String ORDER_REMIND_SHIP_COUNT_PREFIX = "sw:orderRemindShipCount:";
public static final String SHARE_COOKBOOK_CODE = "sw:share:code:";
}