使用Redis缓存实现短信登录逻辑,手机验证码缓存,用户信息缓存

引入依赖

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>

加配置

spring:redis:host: 127.0.0.1  #redis地址port: 6379 #端口password: 123456 #密码,无密码可以注释调database: 10 #库lettuce:pool:max-active: 10 #最大连接数max-idle: 10 #最多空闲min-idle: 1 #至少空闲time-between-eviction-runs: 10s #连接空闲时间

定义登录校验拦截器

/*** 拦截器*/
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {#校验是否登录,UserHolder中使用ThreadLocal保存用户信息if(UserHolder.getUser() == null){ response.setStatus(401); //未登录响应401状态码return false;}return true; //放行}
}

定义刷新token拦截器(只用于刷新token时间)

/*** 刷新token 拦截器*/
public class RefreshTokenInterceptor implements HandlerInterceptor {private StringRedisTemplate stringRedisTemplate; //LoginInterceptor 是自己创建的不能autowirepublic RefreshTokenInterceptor(StringRedisTemplate stringRedisTemplate) {this.stringRedisTemplate = stringRedisTemplate;}@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//获取携带的token名String token = request.getHeader("authorization");if(StrUtil.isBlank(token)){return true;}//从redis中获取该token值String key = RedisConstants.LOGIN_USER_KEY+token;Map<Object, Object> userMap = stringRedisTemplate.opsForHash().entries(key);if(StrUtil.isBlank(token)){return true;}//将map转BeanUserDTO userDTO = BeanUtil.fillBeanWithMap(userMap, new UserDTO(), false);UserHolder.saveUser(userDTO);//刷新token有效期stringRedisTemplate.expire(key,LOGIN_USER_TTL, TimeUnit.MINUTES);return true;}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {UserHolder.removeUser();}
}

保存用户信息类:

public class UserHolder {private static final ThreadLocal<UserDTO> tl = new ThreadLocal<>();public static void saveUser(UserDTO user){tl.set(user);}public static UserDTO getUser(){return tl.get();}public static void removeUser(){tl.remove();}
}

新建配置类LoginConfig,添加自己定义的拦截器


@Configuration
public class MVCConfig implements WebMvcConfigurer {@Resourceprivate StringRedisTemplate stringRedisTemplate;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginInterceptor()).excludePathPatterns( //添加排除路径"/user/code","/user/login",).order(1); //order值越小越先执行,值相等则先添加先执行registry.addInterceptor(new RefreshTokenInterceptor(stringRedisTemplate)).order(0);}}

 登录逻辑

校验手机号 --> 校验验证码 --> 检查用户是否存在 --> 生成token --> 将用户信息user转成Hash存储到redis中 --> 设置token有效期

其中token可用hutool的UUID生成: UUID.randomUUID().toString(true); //true是不要短横线 -

将用户实体转成Map集合,存放到redis中:

Map<String, Object> userMap = BeanUtil.beanToMap(userDTO,new HashMap<>(),CopyOptions.create().setIgnoreNullValue(true).setFieldValueEditor((fieldName,fieldValue)-> fieldValue.toString())); //所有字段值转为String//存redisString tokenKey = LOGIN_USER_KEY + token;stringRedisTemplate.opsForHash().putAll(tokenKey,userMap);

 设置Token有效期

        //设置token有效期stringRedisTemplate.expire(tokenKey,LOGIN_USER_TTL,TimeUnit.MINUTES); //分钟

 

手机号验证,可添加一个插件,快捷查询各种校验的正则表达式:

将验证码存入redis并设置验证码有效期

         //模拟生成验证码String code = RandomUtil.randomNumbers(6);//手机号唯一stringRedisTemplate.opsForValue().set(LOGIN_CODE_KEY + phone, code, LOGIN_CODE_TTL, TimeUnit.MINUTES);

常量命名规范:

    public static final String LOGIN_CODE_KEY = "login:code:"; //验证码的keypublic static final Long LOGIN_CODE_TTL = 2L; //验证码的有效期public static final String LOGIN_USER_KEY = "login:token:"; //token的keypublic static final Long LOGIN_USER_TTL = 30L; //token的有效期

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/849402.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

毫米波雷达深度学习技术-1.6目标识别1

1.6 目标识别 利用检测和跟踪在距离、多普勒和角度这两个维度中的任意一个进行精确的目标定位后&#xff0c;将检测到的目标分类到所需的类别中。与检测类似&#xff0c;提出了多种框架来同时使用图像和点云进行目标分类。使用图像进行目标分类的最常见方法是从检测到的目标特征…

10款必备软件,每款都是神器,赶快用起来吧!

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/最近有很多小伙伴在咨询&#xff0c;我也抓紧时间整理了一些不错的软件和我陆续收到的&#xff0c;希望对大家有所帮助。 1. 全球鼠标——MouseI…

vue2组件封装实战系列之space组件

组件之 GfSpace 多个同类型的内容比如 div/span/button/li 等&#xff0c;实现水平、垂直方向的均匀布局的功能 效果预览 属性 参数类型说明可选值默认值flexBoolean是否 flex 布局true/falsefalsegapNumber内容间距-10directionString内容排列方向row/columnrow 代码实现 这…

机器学习扩展包MLXtend绘制分类模型决策边界

公众号&#xff1a;尤而小屋编辑&#xff1a;Peter作者&#xff1a;Peter 大家好&#xff0c;我是Peter~ 继续更新机器学习扩展包MLxtend的文章。本文介绍如何使用MLxtend来绘制与分类模型相关的决策边界decision_regions。 导入库 导入相关用于数据处理和建模的库&#xff…

技术对比:eMMC、SD NAND与NOR Flash存储特性详解

在电子技术迅猛前进的今天&#xff0c;存储技术成为了整个行业发展的基石。SD NAND、eMMC和NOR Flash&#xff0c;这三种存储技术各自以其独特的架构和特性&#xff0c;满足了多样化的存储需求。让我们来看看它们之间的一些关键对比&#xff1a; 1. 存储单元架构&#xff1a; S…

Perfectly Clear WorkBench v4 解锁版安装教程 (图像修复增强工具)

前言 Perfectly Clear WorkBench 是一款图像修复工具&#xff0c;可以帮助用户对自己的图片素材进行修复&#xff0c;很多的照片因为拍摄问题&#xff0c;或者设备限制&#xff0c;会导致拍摄效果不好&#xff0c;使用这款软件可以进行一定程度的修复&#xff0c;当拍摄时亮度…

Ant Design+react 表单只读

表单禁用&#xff0c;样式不好看&#xff0c;不符合甲方标准&#xff0c;看了一下文档&#xff0c;select、radio等都不支持只读状态。 解决方法&#xff1a; 利用css3的point-events属性&#xff0c;设置为none 在查看弹窗时&#xff0c;传入一个变量&#xff0c;当变量为true…

了解光隔离器和光耦合器:主要区别和应用

光隔离器和光耦合器是现代电子电路中必不可少的组件&#xff0c;提供一项关键功能&#xff1a;电路不同部分之间的电气隔离。虽然它们在许多方面相似且经常互换使用&#xff0c;但两者之间存在明显差异&#xff0c;主要基于它们的工作电压能力。本文深入探讨了这些组件的基础知…

最新23道vue2+vue3面试题带答案汇总

文章目录 MVVM与MVC的区别Vue 2与Vue 3的主要区别Vue 3的优势Vue 2 是如何实现数据绑定的&#xff1f;Vue 2 中的 v-model 是如何工作的&#xff1f;Vue 2 的生命周期钩子有哪些&#xff1f;Vue 3 使用了什么技术来实现响应式系统&#xff1f;Vue 3 中的 Composition API 带来了…

windows系统内查看电脑SN号

cmd命令行模式下&#xff0c;输入代码wmic bios get serialnumber可以查看到当前计算机的SN号码

Python爬取与可视化-豆瓣电影数据

引言 在数据科学的学习过程中&#xff0c;数据获取与数据可视化是两项重要的技能。本文将展示如何通过Python爬取豆瓣电影Top250的电影数据&#xff0c;并将这些数据存储到数据库中&#xff0c;随后进行数据分析和可视化展示。这个项目涵盖了从数据抓取、存储到数据可视化的整个…

记一次Linux下Docker镜像服务器磁盘空间清理

我们开发环境Jenkins构建项目时报服务器磁盘空间不足&#xff0c;导致项目自动化构建部署失败&#xff0c; Docker镜像服务器磁盘空间清理我们做了多次了&#xff0c;之前在清理Docker镜像服务器时走了不少弯路&#xff0c;查了不少Docker镜像服务器空间清理&#xff0c;都大同…

JAVA网络编程,反射及注解知识总结

文章目录 网络编程软件架构三要素IP端口号协议UDP协议发送数据接收数据三种通信方式 TCP协议客户端服务器端三次握手四次挥手 反射获取字节码文件获取构造方法获取成员变量获取成员方法反射的作用 动态代理注解作用格式使用位置注解的原理常见注解元注解自定义注解解析注解 网络…

自然语言处理(NLP)—— 语言检测器

1. 文章概述 1.1 目的 在本篇文章中&#xff0c;我们将构建一个语言检测器&#xff0c;这是一个能够识别文本语言的简单分类器。这是一个能够识别文本是用哪种语言写的程序。想象一下&#xff0c;你给这个程序一段文字&#xff0c;它就能告诉你这是英语、法语还是其他语言。 …

Moonshot AI API使用(1)-获取MOONSHOT_API_KEY

Moonshot AI 开放平台 用户注册&#xff0c;使用微信扫码登录 把这个key复制下来

用你熟悉的语言就能开发智能合约,Vara Network 以 WASM 解锁未来应用创新

Vara Network 自推出以来&#xff0c;凭借其基于 Gear Protocol 的独特架构和强大的开发工具&#xff0c;为开发者提供了一个高效、安全的智能合约构建平台。Vara Network 通过采用先进的 Actor 模型、持久内存概念和 WebAssembly 技术&#xff0c;实现了异步消息处理、并行计算…

OpenFeign --学习笔记

什么是OpenFeign&#xff1f; OpenFeign可以想象成一座连接客户端&#xff08;服务器&#xff09;和服务器之间的桥梁。在微服务架构中&#xff0c;各个服务之间像小岛屿一样分布在网络上&#xff0c;它们需要相互通信才能协同工作。但是&#xff0c;这些岛屿之间并没有现成的…

SVNCloud 与 Navicat和IDEA的连接

文章目录 SVNCloud 配置Navicat访问云端数据库与IDEA Java jdbc 的连接 SVNCloud 配置 访问网址&#xff1a;SVN注册账号&#xff0c;进入mysql区域&#xff1a; 数据库管理->创建数据库&#xff0c;输入数据库名称和密码&#xff0c;注意&#xff0c;这里的数据库名称实际…

6、后端项目初始化

打开idea后&#xff0c; New Project &#xff0c;用Maven构建 Spring Boot 项目 点击Next后&#xff1a;先勾选两个基本的依赖&#xff0c;后面再手动添加其它需要的依赖 Spring Web: 表示是一个web应用程序 Lombok&#xff1a;写实体类的时候添加Data注解后就会自动加上g…

Linux网络编程:网络层协议|IP

目录 前言&#xff1a; 1.IP协议 1.1.IP协议格式 1.2.网段划分 1.2.1.知识引入 1.2.2.IP地址划分和子网掩码 1.3.IP地址分类 1.3.1.特殊IP地址 ​编辑 1.3.2.私有IP和公网IP 1.3.3.浅谈NAT技术 1.4.路由 1.4.1.什么是路由 1.4.2.路由表 1.5.网络层数据切片和组装…