【未完成】springboot项目实现扫码登录相关逻辑
准备工作
配置redis
引入redis依赖
<dependencies><!-- Spring Data Redis 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- Jedis 依赖 --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId></dependency>
</dependencies>
在application.yml中配置redis
spring:redis:host: 127.0.0.1port: 6379database: 0password:
配置 Jedis 连接池
@Component
@ConfigurationProperties(prefix = "spring.redis")
public class RedisConfigInfo {private String host;private Integer port;private Integer database;private String password;// 省略getter、setter方法
}
@Configuration
public class JedisConfig {@Autowiredprivate RedisConfigInfo redisConfigInfo;@Beanpublic JedisConnectionFactory jedisConnectionFactory() {RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();redisStandaloneConfiguration.setHostName(redisConfigInfo.getHost());redisStandaloneConfiguration.setPort(redisConfigInfo.getPort());String password = redisConfigInfo.getPassword();// 将字符串类型的密码转换为 RedisPassword 类型if (password != null && !password.isEmpty()) {redisStandaloneConfiguration.setPassword(RedisPassword.of(password));} else {redisStandaloneConfiguration.setPassword(RedisPassword.none());}redisStandaloneConfiguration.setDatabase(redisConfigInfo.getDatabase());return new JedisConnectionFactory(redisStandaloneConfiguration);}@Beanpublic RedisTemplate<String, Object> redisTemplate() {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(jedisConnectionFactory());// 设置键的序列化器为 StringRedisSerializertemplate.setKeySerializer(new StringRedisSerializer());// 设置哈希键的序列化器为 StringRedisSerializertemplate.setHashKeySerializer(new StringRedisSerializer());// 设置值的序列化器为 GenericJackson2JsonRedisSerializer,用于处理 JSON 数据template.setValueSerializer(new GenericJackson2JsonRedisSerializer());// 设置哈希值的序列化器为 GenericJackson2JsonRedisSerializertemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());return template;}
}
QrCodeController
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;@RestController
@RequestMapping("/qr-code")
public class QrCodeController {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;// 生成二维码的接口@GetMapping(value = "/generate", produces = MediaType.APPLICATION_JSON_VALUE)public ResponseEntity<Map<String, String>> generateQrCode() {// 生成一个唯一的登录请求标识符String token = UUID.randomUUID().toString();// 存储 token 到 Redis 并设置 5 分钟有效期redisTemplate.opsForValue().set(token, "valid", 5, TimeUnit.MINUTES);// 封装返回的 JSON 数据Map<String, String> response = new HashMap<>();response.put("token", token);return ResponseEntity.ok(response);}// APP 扫描二维码后调用的接口@PostMapping("/scan")public String scanQrCode(@RequestBody ScanRequestInfo scanRequestInfo) {String token = request.getToken();String userId = request.getUserId();Map<String, String> response = new HashMap<>();if ("valid".equal(redisTemplate.opsForValue().get(token))) {// 将查询到用户信息(主要是token)放入缓存redisTemplate.opsForValue().set(token, userId, 1, TimeUnit.MINUTES);response.put("code", 0);} else {response.put("code", -1);}return ResponseEntity.ok(response);}@GetMapping("/checkLoginStatus")public String checkLoginStatus(@RequestParam String token) {// 使用 RedisTemplate 从 Redis 中获取登录状态String userId = (Boolean) redisTemplate.opsForValue().get(token);Map<String, String> response = new HashMap<>();if (userId != null && "valid".equal(userId)) { // 根据userId查询用户信息并返回UserInfo userInfo = new UserInfo();response.put("code", 0);response.put("userInfo", userInfo);} else {response.put("code", -1);}return ResponseEntity.ok(response);}
}
UserInfo
@Data
public class UserInfo{private String userId;private String userName;private String token;
}
ScanRequestInfo
@Data
public class ScanRequestInfo{private String token;private String userId;
}
引入lombok依赖
<dependencies><!-- 引入 Lombok 依赖 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><!-- 可以根据需要调整版本号 --><version>1.18.26</version><!-- 对于编译和测试范围使用,运行时不需要 --><scope>compile</scope></dependency>
</dependencies>
知识点
Jedis 和 Lettuce
Jedis:是 Redis 官方推荐的 Java 客户端之一,出现时间较早。其提供了非常全面且直观的 API,和 Redis 命令的对应关系十分清晰,开发人员可以方便地使用这些 API 来直接操作 Redis。
Lettuce:是基于 Netty 框架实现的高性能 Redis 客户端,Netty 是一个异步事件驱动的网络应用程序框架,使得 Lettuce 具有非阻塞和异步的特性。它被广泛应用于 Spring Boot 2.x 默认的 Redis 客户端。
小技巧
区分本地运行配置和测试环境运行配置
可以在application.properties和application.yml文件中分别配置:
application.properties(本地,不提交到git)
server.port=8080
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=
spring.redis.database=0
application.yml(提交到git)
spring:redis:host: 127.0.0.1port: 6379database: 0password:
server:port: 8080
相关文章:
【未完成】springboot项目实现扫码登录相关逻辑
准备工作 配置redis 引入redis依赖 <dependencies><!-- Spring Data Redis 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><…...
html、js、css实现爱心效果
好的!我们可以进一步美化这个爱心效果,增加更多动态和视觉吸引力。以下是改进后的代码,包括以下功能: 1. 背景渐变:添加动态背景渐变效果。 2. 爱心阴影:为爱心添加阴影,使其更具立体感。 3. 随…...
【前端】Hexo 建站指南
文章目录 前言生成站点本地测试部署云端参考 前言 更好的阅读体验:https://blog.dwj601.cn/FrontEnd/Hexo/build-your-own-website-with-hexo/ 笔记记多了,想要分享给同学们一起交流进步,该怎么办?想要搭建一个属于自己的知识库…...
OpenStack基础架构
openstack是一套IaaS云的解决方案,是一个开源的云计算管理平台 每一台物理机上都会有一个nova服务器 虚拟化其实是在nova主机里启用的 COW技术: 这么来看,3个物理机上产生10个虚拟机,所以把服务分散到10个虚拟机上和分散到4个虚拟…...
1905电影网中国地区电影数据分析(一) - 数据采集、清洗与存储
文章目录 前言一、数据采集步骤及python库使用版本1. python库使用版本2. 数据采集步骤 二、数据采集网页分析1. 分析采集的字段和URL1.1 分析要爬取的数据字段1.2 分析每部电影的URL1.2 分析每页的URL 2. 字段元素标签定位 三、数据采集代码实现1. 爬取1905电影网分类信息2. 爬…...
IPhone16 Plus 设备详情
目录 产品宣传图内部图——前内部图——后设备详细信息 产品宣传图 内部图——前 内部图——后 设备详细信息 信息收集于HubWeb.cn...
埃氏算法C++实现: 快速输出质数( 素数 )
目录 1.简介 算法原理 算法特点 应用场景 2.一般求素数方法 3.埃氏算法求素数 3.1.无动态分配 3.2.有动态分配 1.简介 埃氏算法(Eratosthenes Sieve),全称为埃拉托斯特尼筛法,是一种由古希腊数学家埃拉托斯特尼在公元…...
后端的config包中的常用配置
文章目录 一. CorsConfig二. Knife4jConfig三. MyBatisPlusConfig四. RedisTemplateConfig五. RedissonConfig 一. CorsConfig 全局跨域配置 Configuration public class CorsConfig implements WebMvcConfigurer {Overridepublic void addCorsMappings(CorsRegistry registr…...
基于亿坊PHP框架构建物联网解决方案的优势分析!
在物联网 (IoT) 领域,选到合适的框架对于整个项目的开展也尤为重要。通常情况下,基于PHP的一些主流框架被用户常选择,今天就带大家了解下基于亿坊PHP框架构建物联网解决方案的优势有哪些? 1、开发效率高 在物联网项目中…...
IoTDB结合Mybatis使用示例(增删查改自定义sql等)
IoTDB时序库是当前越来越流行以及基于其优势各大厂商越来越易接受的国产开源时序数据库,针对IoTDB的内容不做过多介绍,在使用该时序库时,往往有一定入门门槛,不同于关系型数据库或文档型数据库那般方便维护和接入开发,…...
skynet 源码阅读 -- 启动主流程
Skynet 启动主流程分析 Skynet 是一个轻量级、高并发的服务器框架。它在启动时会进行一系列初始化操作,并启动多个不同功能的线程(Monitor、Timer、Worker、Socket),从而实现消息分发、定时器、网络I/O等核心功能。本文主要从 ma…...
OpenCV:高通滤波之索贝尔、沙尔和拉普拉斯
目录 简述 什么是高通滤波? 高通滤波的概念 应用场景 索贝尔算子 算子公式 实现代码 特点 沙尔算子 算子公式 实现代码 特点 拉普拉斯算子 算子公式 实现代码 特点 高通滤波器的对比与应用场景 相关阅读 OpenCV:图像滤波、卷积与卷积核…...
UDP 广播组播点播的区别及联系
1、网络IP地址的分类 组播地址是分类编址的IPv4地址中的D类地址,又叫多播地址,他的前四位必须是1110,所以网络地址的二进制取值范围是11100000~11101111对应的十进制为 224~~239。所以以224~239开头的网络地址都是组播地址。 组播地址的功能…...
STM32补充——IAP
0 前置知识: FLASH相关内容:前往STM32补充——FLASH STM32三种烧录方式(看看就行): 1.ISP:In System Programming(在系统编程) 执行芯片厂商的 Bootloader 程序进入 ISP 模式&…...
Jetson Xavier NX (ARM) 使用 PyTorch 安装 Open3D-ML 指南
由于 Jetson 为 ARM64 (aarch64) 的系统架构,所以不能用 pip install 直接安装,需要通过源码编译。 升级系统 JetPack 由于 Open3D-ML 目前只支持 CUDA 10.0 以及 CUDA 11.*,并且 JetPack 的 CUDA 开发环境只有10.2、11.4以及12.2࿰…...
【C++高并发服务器WebServer】-1:Linux中父子进程fork创建及关系、GDB多进程调试
本文目录 一、进程创建二、GDB多进程调试 一、进程创建 在Linux中输入man 2 fork可以查看man文档中的fork的相关函数信息。 fork的作用就是创建一个子进程。 通过fork我们可以知道,创建子进程的时候,复制父进程的信息。 我们看看翻译的man文档信息&am…...
C语言数组详解:从基础到进阶的全面解析
在C语言中,数组是一种基本的数据结构,用于存储多个相同类型的数据。数组的引入使得C语言能够高效地存储和操作大量数据。在任何一个C语言程序中,数组都发挥着极其重要的作用。无论是在算法实现、数据存储、还是在复杂程序的设计中,…...
docker的前世今生
docker来自哪里? 从我们运维部署的历史来看,宿主机从最初的物理机到虚拟机,再到docker,一步步演进到现在。技术演进其实是为了解决当前技术的痛点,那我们来看看有哪些痛点以及如何克服痛点的。 物理机 一般来说&…...
python实现施瓦茨-克里斯托费尔【全网首个】根据用户输入推测函数
上代码: from sympy import symbols, integrate, simplify from sympy.plotting import plotn int(input("n:")) if n < 2:print("Error: Must n > 2") i 0 a [] aef [] A [] x, y symbols(x y) z, w symbols(z w)while i < n…...
c语言中的数组(上)
数组的概念 数组是⼀组相同类型元素的集合; 数组中存放的是1个或者多个数据,但是数组元素个数不能为0。 数组中存放的多个数据,类型是相同的。 数组分为⼀维数组和多维数组,多维数组⼀般⽐较多⻅的是⼆维数组。 数组创建 在C语言…...
如何彻底安全地卸载微软Edge浏览器:EdgeRemover专业指南
如何彻底安全地卸载微软Edge浏览器:EdgeRemover专业指南 【免费下载链接】EdgeRemover PowerShell script to remove Microsoft Edge in a non-forceful manner. 项目地址: https://gitcode.com/gh_mirrors/ed/EdgeRemover 你是否厌倦了Windows系统预装的Mic…...
计算机毕业设计springboot长春的地铁综合服务管理系统 基于SpringBoot的城市轨道交通智慧运维管理平台 SpringBoot框架下的地铁运营调度与设备管控系统
计算机毕业设计springboot长春的地铁综合服务管理系统 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着城市化进程的加速推进,长春市作为东北地区的重要交通枢纽&…...
计算机毕业设计springboot在线阅读平台的设计与实现 基于SpringBoot的数字化图书阅读与积分兑换服务平台 SpringBoot框架下的网络文献资源管理与读者互动系统
计算机毕业设计springboot在线阅读平台的设计与实现 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。 随着互联网技术的飞速发展和移动智能终端的普及,人们的阅读习惯…...
避坑指南:在Linux DRM驱动开发中,实现plane的update_plane回调时要注意哪些检查?
Linux DRM驱动开发实战:update_plane回调必须处理的4大核心检查 当你为一块新的显示控制器编写DRM驱动时,update_plane回调函数就像是在走钢丝——内核框架已经帮你过滤了明显的错误,但剩下的每一步操作都直接影响显示稳定性和系统可靠性。本…...
实战应用:定制专属labelimg,快速生成YOLO格式车辆检测数据集
实战应用:定制专属labelimg,快速生成YOLO格式车辆检测数据集 在计算机视觉项目中,数据标注是模型训练的基础环节。最近我在做一个车辆检测项目时,发现通用的标注工具往往无法完全满足特定需求。比如我需要同时生成PASCAL VOC和YO…...
React Scroll Parallax核心组件详解:Parallax、ParallaxBanner和ParallaxProvider
React Scroll Parallax核心组件详解:Parallax、ParallaxBanner和ParallaxProvider 【免费下载链接】react-scroll-parallax 🔮 React hooks and components to create parallax scroll effects for banners, images or any other DOM elements. 项目地…...
mPLUG-Owl3-2B多模态推理优化教程:FP16加载+SDPA注意力提速实测
mPLUG-Owl3-2B多模态推理优化教程:FP16加载SDPA注意力提速实测 1. 开篇:为什么需要优化多模态推理? 如果你尝试过在个人电脑上运行多模态AI模型,很可能遇到过这些问题:显存不足导致程序崩溃、推理速度慢得让人着急、…...
别再死磕逐位计算了!用C语言手撸一个CRC32查表函数(附完整代码和表格生成)
从零构建高性能CRC32查表算法:嵌入式场景的极致优化实践 在嵌入式开发中,数据校验的效率和资源消耗往往成为系统设计的瓶颈。传统逐位计算的CRC32实现虽然直观,但在处理高速数据流或资源受限环境时,其性能劣势暴露无遗。查表法通过…...
告别内置数据库:NocoBase企业级部署为何推荐外接MySQL?实战配置详解
企业级NocoBase部署:为什么外接MySQL是必选项? 当技术团队从原型验证转向生产环境部署时,数据库选型往往成为第一个关键决策点。NocoBase作为企业级无代码平台,虽然内置了开箱即用的SQLite数据库,但在真实业务场景中&a…...
保姆级教程:用Arduino IDE给你的ESP8266写个‘网络诊断’程序,一键排查连接问题
ESP8266网络诊断工具开发实战:从被动排错到主动分析 当你盯着串口监视器里不断滚动的"Connecting..."字样,而ESP8266始终无法连上WiFi时,是否想过——我们本可以做得比盲目重试更聪明?本文将带你开发一个会"思考&q…...
