在登陆功能中添加Redis缓存

news/2024/12/21 22:12:09/

目录

基于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;}

运行测试


http://www.ppmy.cn/news/1535066.html

相关文章

css三角形:css画箭头向下的三角形

.arrow { position: absolute; bottom: 0; left: 50%; transform: translateX(-50%); width: 0; height: 0; border-style: solid; border-width: 8px 5px 0 5px; /* 上、左、下、右 */ bord…

(10)MATLAB莱斯(Rician)衰落信道仿真1

文章目录 前言一、莱斯分布随机变量二、仿真代码与结果1.仿真代码2.仿真结果画图 后续 前言 首先给出莱斯衰落信道模型&#xff0c;引入了莱斯因子K&#xff0c;并给出莱斯分布的概率密度函数公式。然后导出莱斯分布随机变量的仿真表示式&#xff0c;建立MATLAB仿真代码&#…

c++联合体

// // Created by 徐昌真 on 2024/10/5. // #include <iostream> using namespace std;//定义一个结构体 struct DataS{ //内存空间独立int a;double b;char c[10]; };//定义一个联合体 union DataU{ //内存空间在一起int a;double b;char c[10]; };int main() {//创建…

详解代理模式-【静态代理与JDK动态代理】(非常的斯国一)

目录 静态代理 什么是静态代理: ​ 特点: 例子&#xff1a; JDK动态代理&#xff08;主要讲点&#xff09; 大纲&#xff1a; 1、与静态代码的联系 2、JDK动态代理的主流程 3、Proxy的源码 整体概述&#xff1a; 重要点的翻译 &#xff1a; newProxyInstance源码&am…

大模型使用vLLM推理加速

关于vLLM推理加速&#xff0c;可以参考之前的帖子&#xff1a;vLLM加速组件XFormers与FlashAttention的区别 在使用 vLLM 进行模型推理时&#xff0c;即使你不显式调用 tokenizer&#xff0c;vLLM 也会自动处理 tokenization。vLLM 内部会使用模型对应的 tokenizer 来对输入文本…

KiCad 综合笔记

开窗 选中顶层或者底层 Mask 层,然后进行覆铜: 四层板 KiCad Tutorial - How to make a 4 layer PCB https://bbs.elecfans.com/jishu_2365544_1_1.html 虽然在“电路板设置”中,可以选择铜层的类型,但如果选择了“电源层”,除了用于告诉“Free router”布线器在自动布…

大厂笔试现已经禁用本地IDE怎么看

如果我说本来面试做题这种事情就是反人类你相信吗&#xff1f; 这个罪恶的源头就是 Google&#xff0c;说是为了选择高素质的计算机编程水平的人才&#xff0c;然后把面试就变成了考试&#xff0c;最大的受益者当然是印度人了。 当把一个考察过程变成标准化的考试过程&#x…

Redis:初识Redis

Redis&#xff1a;初识Redis Redis 介绍分布式架构Redis特性安装Redis Redis 介绍 在官网中&#xff0c;是如下介绍Redis的&#xff1a; in-memory data store used by millions of developers as a cache, vector database, document database, streaming engine, and messag…