建网站收费多少钱,asp做素材网站,竞价网站单页,聚美优品的电子商务网站建设论文首先我们要思考一下利用redis来存储数据#xff0c;那么到底使用哪种结构呢#xff1f;由于存入的数据比较简单#xff0c;我们可以考虑使用String#xff0c;或者是使用哈希#xff0c;如下图#xff0c;如果使用String#xff0c;同学们注意他的value#xff0c;用多…首先我们要思考一下利用redis来存储数据那么到底使用哪种结构呢由于存入的数据比较简单我们可以考虑使用String或者是使用哈希如下图如果使用String同学们注意他的value用多占用一点空间如果使用哈希则他的value中只会存储他数据本身如果不是特别在意内存其实使用String就可以啦。 1、设计key的具体细节
所以我们可以使用String结构就是一个简单的keyvalue键值对的方式但是关于key的处理session他是每个用户都有自己的session但是redis的key是共享的咱们就不能使用code了
在设计这个key的时候我们之前讲过需要满足两点
1、key要具有唯一性
2、key要方便携带
如果我们采用phone手机号这个的数据来存储当然是可以的但是如果把这样的敏感数据存储到redis中并且从页面中带过来毕竟不太合适所以我们在后台生成一个随机串token然后让前端带来这个token就能完成我们的整体逻辑了
2、整体访问流程
当注册完成后用户去登录会去校验用户提交的手机号和验证码是否一致如果一致则根据手机号查询用户信息不存在则新建最后将用户数据保存到redis并且生成token作为redis的key当我们校验用户是否登录时会去携带着token进行访问从redis中取出token对应的value判断是否存在这个数据如果没有则拦截如果存在则将其保存到threadLocal中并且放行。 3 基于Redis实现短信登录
这里具体逻辑就不分析了之前咱们已经重点分析过这个逻辑啦。
UserServiceImpl代码
Override
public Result login(LoginFormDTO loginForm, HttpSession session) {// 1.校验手机号String phone loginForm.getPhone();if (RegexUtils.isPhoneInvalid(phone)) {// 2.如果不符合返回错误信息return Result.fail(手机号格式错误);}// 3.从redis获取验证码并校验String cacheCode stringRedisTemplate.opsForValue().get(LOGIN_CODE_KEY phone);String code loginForm.getCode();if (cacheCode null || !cacheCode.equals(code)) {// 不一致报错return Result.fail(验证码错误);}// 4.一致根据手机号查询用户 select * from tb_user where phone ?User user query().eq(phone, phone).one();// 5.判断用户是否存在if (user null) {// 6.不存在创建新用户并保存user createUserWithPhone(phone);}// 7.保存用户信息到 redis中// 7.1.随机生成token作为登录令牌String token UUID.randomUUID().toString(true);// 7.2.将User对象转为HashMap存储UserDTO userDTO BeanUtil.copyProperties(user, UserDTO.class);MapString, Object userMap BeanUtil.beanToMap(userDTO, new HashMap(),CopyOptions.create().setIgnoreNullValue(true).setFieldValueEditor((fieldName, fieldValue) - fieldValue.toString()));// 7.3.存储String tokenKey LOGIN_USER_KEY token;stringRedisTemplate.opsForHash().putAll(tokenKey, userMap);// 7.4.设置token有效期stringRedisTemplate.expire(tokenKey, LOGIN_USER_TTL, TimeUnit.MINUTES);// 8.返回tokenreturn Result.ok(token);
}