Redis应用_会话管理

news/2025/3/18 10:48:23/文章来源:https://www.cnblogs.com/mxj-lck/p/18778472

Redis应用——会话管理

​ 会话管理的核心是跟踪用户的会话状态,通常为每个用户分配一个唯一的会话 ID(Session ID),将用户的相关信息存储在服务器端,并通过该 ID 进行关联和查询。Redis 可以作为存储会话信息的数据库,将会话 ID 作为键,用户信息作为值进行存储。

一、配置Redis环境

可以参考之前的文章:SpringBoot配置Redis环境

拦截器

这里我们使用Spring提供的拦截器,可在请求处理前后和完成后执行特定逻辑。

定义拦截器类

注入依赖 RedisTemplate,执行请求前的逻辑 :

@Component
public class RequestInterceptor implements HandlerInterceptor {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {// 执行请求前的逻辑return true;}
}

配置拦截器

将拦截器类的对象作为参数添加进拦截器中:

@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate RequestInterceptor requestInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(requestInterceptor).addPathPatterns("/**");}
}

cookie处理逻辑

在拦截器RequestInterceptor中定义preHandle的执行逻辑

  • 从请求中获取cookie
  • 如果存在cookie的话,根据cookie去redis中获取用户数据
  • 如果没有获取到用户数据的话,要么就是请求中不含cookie,要么就是redis中没有存用户数据,因此需要重新生成一个cookie,并将cookie作为键,用户数据作为值存储在redis中
  • 将cookie放到响应数据中返回
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {Cookie[] lckcookies = request.getCookies();String cookie = null;if (lckcookies != null){for (Cookie lckcookie : lckcookies){if (lckcookie.getName().equals("lckcookie")){cookie = lckcookie.getValue();}}}String userId = null;if (cookie != null){userId = (String) redisTemplate.opsForValue().get(cookie);}if (userId == null){// 生成一个唯一的 Cookie 值,这里使用 UUID 作为示例String newCookieValue = UUID.randomUUID().toString();redisTemplate.opsForValue().set(newCookieValue,"user123",3600, TimeUnit.SECONDS);// 创建一个新的 Cookie 对象Cookie newCookie = new Cookie("lckcookie", newCookieValue);// 设置 Cookie 的属性,例如有效期、路径等// 设置 Cookie 的有效期为 3600 秒(1 小时)newCookie.setMaxAge(3600);// 设置 Cookie 的路径为根路径newCookie.setPath("/");// 将新的 Cookie 添加到响应中response.addCookie(newCookie);}System.out.println(cookie);System.out.println("拦截器拦截请求");return true;
}

测试

这里我用到Apifox进行测试,随便写个接口,向这个接口发出请求:

image-20250318092134268

在发出请求时,是不携带任何参数的,也不携带cookie,因此在Cookie管理中是没有任何cookie的,可以在控制台看到打印的结果如下:

在发出请求后再打开Cookie管理,可以看到有了一条cookie,并且这条cookie会在下次发出请求时被携带:

控制台执行结果:

注意

问题

在代码中有一个点要非常注意,这个问题设计到 spring 的源码,需要对 Spring IOC 有一定了解。

这个问题就是在 WebConfig 中,当添加拦截器时,是需要将拦截器类的对象作为参数传进去的,因此除了上面添加拦截器的方法外,还有如下写法来添加拦截器:

@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new RequestInterceptor()).addPathPatterns("/**");}
}

但是这个添加拦截器的方法在实际执行拦截逻辑时会报错,并且报的是 redisTemplate 为空的错:

这是为啥呢?

依赖注入问题

RequestInterceptor 类中,使用了 @Autowired 注解来注入 RedisTemplate<String, Object> 对象,代码如下:

@Autowired
private RedisTemplate<String, Object> redisTemplate;

当使用 new RequestInterceptor() 手动创建 RequestInterceptor 对象时,Spring 框架不会对这个手动创建的对象进行依赖注入。也就是说,redisTemplate 字段将为 null。在后续调用 redisTemplate 的方法时,会抛出 NullPointerException 异常。

Bean 生命周期管理问题

Spring 框架负责管理 Bean 的生命周期,包括创建、初始化、销毁等过程。当你使用 @Component 注解将 RequestInterceptor 类标记为 Spring 组件时,Spring 会自动将其创建为一个 Bean,并对其进行管理。

而使用 new RequestInterceptor() 手动创建的对象,不受 Spring 框架的管理,它不会经历 Spring 提供的初始化和销毁等生命周期回调方法。

具体的可以看这篇文章:Spring注入属性和依赖对象源码分析

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

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

相关文章

2025版PLM选型标准:10个行业TOP3厂商适配性对比

产品生命周期管理(PLM)系统在企业的产品研发、生产与管理过程中扮演着至关重要的角色。随着时间的推移,到 2025 年,不同行业对于 PLM 系统的需求更加多样化和精细化。选择一款适配自身行业特点的 PLM 系统,成为众多企业提升竞争力的关键举措。接下来,我们将深入探讨 10 个…

对象存储COS 云顾问:安全管理重磅升级,守护数据安全!

导语 在数字化浪潮下,对象存储 COS 作为海量数据的核心载体,安全防护能力至关重要。存储桶配置不当可能引发数据泄露、流量盗刷等安全问题,因此腾讯云对象存储 COS 基于云顾问的云巡检能力,正式推出全新「安全管理」功能,通过智能巡检、多维评估、实时管控三大核心能力,为…

小程序和APP抓包的问题

小程序和APP抓包的问题 很多同学都会遇到小程序和APP抓不到包的问题,抓不到https请求包,这边给大家提供一些解决方案。 Yakit工具 首先需要的就是一个抓包神器yakit,这个工具非常好用强大,具体安装和使用大家可以参考上一篇文章。 PC端小程序抓包 PC端可以采用双层代理的方…

【多届检索稳定医工交叉会议|EI检索稳且快】-第六届医学人工智能国际学术会议(ISAIMS2025)

大会简介 第六届医学人工智能国际学术会议(ISAIMS 2025)将于2025年10月24-26日于中国西安召开。会议自2020年至今已经成功举办五届,吸引了来自海内外相关领域学者千余名。本届会议将继续围绕人工智能在医学领域的最新研究成果,为来自国内外高等院校、科学研究所、企事业单位…

ChatGLM一键微调

阿里云平台配置DSW交互式建模实例创建每一步记得点击开始,一定要一个个点,下载完在点下一个最后完成之后,点击生成的地址跳转Demo页面Demo页面

关闭 WSL 中正在运行的 Linux 发行版

你使用 WSL 在 Windows 内运行 Linux 吗?你想知道如何关闭在 WSL 中运行的 Linux 发行版吗? 你当然可以在 WSL 中运行的 Linux 系统中 执行 shutdown 命令:sudo shutdown now你还可以使用 wsl 命令关闭 Linux 系统。如果你有多个发行版在 WSL 中运行,这是一种极好的方法。 …

windows如何调出剪贴板所有复制过的内容?

前言 大家好,我是小徐啊。我们在开发Java应用的时候,经常是需要复制粘贴的。我们在windows上面开发的时候,默认都是复制后,就把之前的复制的内容替换了。这就导致我们的复制粘贴很不方便,其实,windows可以支持我们显示最近所有的复制内容的,具体怎么做呢?文末附快捷键方…

AI与.NET技术实操系列(七):使用Emgu CV进行计算机视觉操作

引言 计算机视觉(Computer Vision, CV)是人工智能领域中最为引人注目的分支之一。从自动驾驶汽车到医疗影像分析,从智能安防系统到虚拟现实体验,计算机视觉的应用无处不在,深刻地改变着我们的生活和工作方式。 对于.NET开发者而言,掌握计算机视觉技术不仅意味着能够开发出…

路由器安全研究:D-Link DIR-823G v1.02 B05 复现与利用思路

D-Link DIR-823G v1.02 B05存在命令注入漏洞,攻击者可以通过POST的方式往 /HNAP1发送精心构造的请求,执行任意的操作系统命令。前言 D-Link DIR-823G v1.02 B05存在命令注入漏洞,攻击者可以通过POST的方式往 /HNAP1发送精心构造的请求,执行任意的操作系统命令。 漏洞分析bi…

北斗卫星时钟源,安徽京准助力国产时间精准度

北斗卫星时钟源,安徽京准助力国产时间精准度北斗卫星时钟源,安徽京准助力国产时间精准度 北斗卫星时钟源,安徽京准助力国产时间精准度 京准电钟官微——ahjzsz 北斗卫星时钟源作为中国自主研发的全球卫星导航系统的重要组成部分,其时间精准度的提升依赖于技术创新和系统优化…

ASE60N30-ASEMI工业自动化专用ASE60N30

ASE60N30-ASEMI工业自动化专用ASE60N30编辑:LL ASE60N30-ASEMI工业自动化专用ASE60N30 型号:ASE60N30 品牌:ASEMI 封装:TO-247 最大漏源电流:60A 漏源击穿电压:300V 批号:最新 RDS(ON)Max:38mΩ 引脚数量:3 沟道类型:N沟道MOS管 封装尺寸:如图 特性:MOS管、N沟道…

1周上线,2个月交付!有巢数智如何用 NocoBase 颠覆建筑行业数智化效率

有巢数智利用 NocoBase 平台,在建筑行业实现了数智化转型。 他们在 1 周内上线,2 个月内交付项目,显著提升了项目交付效率。 了解他们如何通过 NocoBase 的插件化架构,快速构建和调整功能,以满足复杂的业务需求。原文链接:https://www.nocobase.com/cn/blog/rapid-develo…