1.模拟sessionId,前后端分离,session存在跨域问题,会导致请求无法携带和服务器对应的cookie,导致session失效。
2.把验证码存进redis中,模拟session机制,实现验证码的生成和校验。
步骤分析 代码实现
生成验证码
请求路径:/api/captcha
请求参数:无
响应数据格式:
{
"code": 1,
"data": {
"code": "5411", //响应的验证码
"rkey": "1479063316897845248" //保存在redis中验证码对应的key,模拟sessioinId
}
}
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private IdWorker idWorker;
@Override
public R
登入校验
@Override
public R login(LoginReqVo vo) {
if (vo==null || Strings.isNullOrEmpty(vo.getUsername())
|| Strings.isNullOrEmpty(vo.getPassword()) || Strings.isNullOrEmpty(vo.getRkey())){
return R.error(ResponseCode.DATA_ERROR.getMessage());
}
//验证码校验
//获取redis中rkey对应的code验证码
String rCode = (String) redisTemplate.opsForValue().get(vo.getRkey());
//校验
if (Strings.isNullOrEmpty(rCode) || !rCode.equals(vo.getCode())) {
return R.error(ResponseCode.DATA_ERROR.getMessage());
}
//redis清除key
redisTemplate.delete(vo.getRkey());
//根据用户名查询用户信息
SysUser user=this.sysUserMapper.findByUserName(vo.getUsername());
//判断用户是否存在,存在则密码校验比对
if (user==null || !passwordEncoder.matches(vo.getPassword(),user.getPassword())){
return R.error(ResponseCode.SYSTEM_PASSWORD_ERROR.getMessage());
}
//组装登录成功数据
LoginRespVo respVo = new LoginRespVo();
BeanUtils.copyProperties(user,respVo);
return R.ok(respVo);
}
总结
1.定义一个生成验证码的接口
第一次先生成验证码存进redis中,返回验证码。
第二次携带验证码登录,对比redis中的验证码,和用户名,密码一起对比,正确登录成功,
对比验证码失败,则销毁验证码,再次生成,进行登录。
2.redis中的key是随机生成的随机码,值是验证码的值。如果redis中的key是验证码的话,访问量大会出现重复的问题。



