您的位置:首页 > 游戏 > 游戏 > 什么是网络营网络销售好做吗谁做过_形象设计师培训网课_网店推广策划书_个人发布信息免费推广平台

什么是网络营网络销售好做吗谁做过_形象设计师培训网课_网店推广策划书_个人发布信息免费推广平台

2024/10/5 21:09:00 来源:https://blog.csdn.net/qq_22554999/article/details/142671930  浏览:    关键词:什么是网络营网络销售好做吗谁做过_形象设计师培训网课_网店推广策划书_个人发布信息免费推广平台
什么是网络营网络销售好做吗谁做过_形象设计师培训网课_网店推广策划书_个人发布信息免费推广平台

目录

基于Redis实现短信登录

实现流程图

实现代码

解决登录状态刷新问题

初始方案思路:

实现代码

发送验证码

登陆实现

如果是新用户则自动创建

运行测试


基于Redis实现短信登录

实现流程图

实现代码

    @Overridepublic Result login(LoginFormDTO loginForm, HttpSession session) {//校验手机号String phone = loginForm.getPhone();if (RegexUtils.isPhoneInvalid(phone)){//手机号格式错误return Result.fail("手机号格式错误");}//从redis获取验证码并校验Object cacheCode = stringRedisTemplate.opsForValue().get(LOGIN_CODE_KEY + phone);String code = loginForm.getCode();if (cacheCode == null){return Result.fail("请输入验证码");}if (!cacheCode.equals(code)){return Result.fail("验证码错误");}//验证码校验成功User user = query().eq("phone", phone).one();//判断用户是否存在if (user == null){user = createUserWithPhone(phone);}//保存用户信息到redis中String token = UUID.randomUUID().toString(true);UserDTO userDTO = BeanUtil.copyProperties(user, UserDTO.class);Map<String, Object> userMap = BeanUtil.beanToMap(userDTO, new HashMap<>(),CopyOptions.create().setIgnoreNullValue(true).setFieldValueEditor((fieldName, fieldValue) -> fieldValue.toString()));//存储tokenString tokenKey = RedisConstants.LOGIN_USER_KEY + token;stringRedisTemplate.opsForHash().putAll(tokenKey,userMap);//设置token有效期stringRedisTemplate.expire(tokenKey,RedisConstants.CACHE_SHOP_TTL, TimeUnit.MINUTES);return Result.ok(token);}

解决登录状态刷新问题

初始方案思路:

添加一个新的拦截器,在第一个拦截器中拦截所有的路径,把第二个拦截器做的事情放入到第一个拦截器中,同时刷新令牌,因为第一个拦截器有了threadLocal的数据,所以此时第二个拦截器只需要判断拦截器中的user对象是否存在即可,完成整体刷新功能。

实现代码

发送验证码

    @Resourceprivate StringRedisTemplate stringRedisTemplate;@Overridepublic Result sendCode(String phone, HttpSession session) {//校验手机号if (RegexUtils.isPhoneInvalid(phone)){//不符合return Result.fail("手机号格式错误");}//符合生成验证码String code = RandomUtil.randomNumbers(6);//保存验证码到redisstringRedisTemplate.opsForValue().set(LOGIN_CODE_KEY + phone,code);//发送验证码log.debug("验证码下发成功,验证码为:{}",code);return Result.ok();}

登陆实现

@Slf4j
public class RefreshTokenInterceptor implements HandlerInterceptor {private StringRedisTemplate stringRedisTemplate;public RefreshTokenInterceptor(StringRedisTemplate stringRedisTemplate) {this.stringRedisTemplate = stringRedisTemplate;}@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//获取请求头中的tokenString token = request.getHeader("authorization");if (StrUtil.isBlank(token)) {return true;}String key = RedisConstants.LOGIN_USER_KEY + token;//获取session中的用户Map<Object, Object> userMap = stringRedisTemplate.opsForHash().entries(key);System.out.println(userMap);//判断用户是否存在if (userMap.isEmpty()){return true;}//将查询到的hash值转为userDtoUserDTO userDTO = BeanUtil.fillBeanWithMap(userMap, new UserDTO(), false);//保存用户信息到threadLocalUserHolder.saveUser(userDTO);stringRedisTemplate.expire(key,RedisConstants.CACHE_SHOP_TTL, TimeUnit.MINUTES);//放行return true;}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {//销毁用户信息UserHolder.removeUser();}
}

如果是新用户则自动创建

    private User createUserWithPhone(String phone) {//创建用户User user = new User();user.setPhone(phone);user.setNickName(USER_NICK_NAME_PREFIX +RandomUtil.randomString(10));//保存用户save(user);return user;}

运行测试

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com