电商秒杀系统-案例04-redis下的session控制
前言:
在现代的Web应用中,安全和高效的用户身份验证机制是至关重要的。本文将深入探讨基于令牌的用户登录会话机制,特别是在使用Redis进行会话管理的情景。通过这一案例实战,我们将了解令牌如何在用户身份验证过程中发挥核心作用,并确保用户会话的安全性和有效性。
令牌检查与Redis验证
用户平时会访问我们的系统,在处理任何一个请求之前,必须检查一下,这个请求是否带上了一个令牌。如果带了一个令牌,那么此时就必须在Redis里检查一下,这个令牌是否有在Redis里合法的、有效的一个session会话。如果有这个session会话,此时就可以允许这个请求被处理,因为说明这个人之前已经登录过我们的系统了,登录过后才会在Redis里放一个有效的session会话;如果说没有这个session的话,此时就会导致用户必须强制被迫登录。
用户登录与令牌发放
如果用户登录通过之后,就会返回给浏览器或者客户端一块令牌,同时在Redis里初始化好一个session会话。后续客户端就会在指定时间范围内发送请求的时候带上一块令牌,每次令牌和服务器端的session校验通过就可以执行请求。
令牌过期与强制登录
过一段时间过后,服务端的Redis里的session会话就会过期。过期了之后,又会导致你必须要重新登录,虽然你可能带上了令牌,但是一检查发现这块令牌对应的Redis里的session已经过期了。
Redis命令操作
hset把用户id和令牌存储一下,hset把用户id和过期令牌过期时间存储一下。每次访问系统都让用户带上令牌,如果令牌不存在就是没登录,hget获取存储的令牌和过期时间,如果令牌过期了也要强制登录,如果令牌校验通过,这次请求就可以通过。如果令牌要是过期了,就用hdel把存储的令牌和过期时间都删了。
代码:
package com.example.session;import redis.clients.jedis.Jedis;import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Random;
import java.util.UUID;/*** 示例:用户会话管理*/
public class UserSessionManager {private Jedis redisClient = new Jedis("127.0.0.1");/*** 验证会话是否有效* @param sessionToken 会话令牌* @return 有效性*/public boolean checkSessionValidity(String sessionToken) throws Exception {if(sessionToken == null || sessionToken.isEmpty()) {return false;}String sessionData = redisClient.hget("user_sessions", "session_token:" + sessionToken);if(sessionData == null || sessionData.isEmpty()) {return false;}String sessionExpiry = redisClient.hget("session_expiration_times", "session_token:" + sessionToken);if(sessionExpiry == null || sessionExpiry.isEmpty()) {return false;}SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date sessionExpiryDate = dateFormat.parse(sessionExpiry);if(new Date().after(sessionExpiryDate)) {return false;}return true;}/*** 用户登录* @param user 用户名* @param pass 密码* @return 会话令牌*/public String loginUser(String user, String pass) {System.out.println("登录用户:" + user + ", 密码:" + pass);long userId = new Random().nextInt(100000);String token = UUID.randomUUID().toString().replace("-", "");initializeSession(userId, token);return token;}/*** 初始化用户会话* @param userId 用户ID* @param token 会话令牌*/public void initializeSession(long userId, String token) {SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Calendar calendar = Calendar.getInstance();calendar.add(Calendar.HOUR, 24);String sessionExpiry = dateFormat.format(calendar.getTime());redisClient.hset("user_sessions", "session_token:" + token, String.valueOf(userId));redisClient.hset("session_expiration_times", "session_token:" + token, sessionExpiry);}public static void main(String[] args) throws Exception {UserSessionManager sessionManager = new UserSessionManager();boolean isValid = sessionManager.checkSessionValidity(null);System.out.println("初次访问,会话验证:" + (isValid ? "通过" : "不通过"));String sessionToken = sessionManager.loginUser("alice","password123");System.out.println("登录后获得令牌:" + sessionToken);isValid = sessionManager.checkSessionValidity(sessionToken);System.out.println("再次访问,会话验证:" + (isValid ? "通过" : "不通过"));}
}
相关文章:
电商秒杀系统-案例04-redis下的session控制
前言: 在现代的Web应用中,安全和高效的用户身份验证机制是至关重要的。本文将深入探讨基于令牌的用户登录会话机制,特别是在使用Redis进行会话管理的情景。通过这一案例实战,我们将了解令牌如何在用户身份验证过程中发挥核心作用&…...
贪吃蛇(c实现)
目录 游戏说明: 第一个是又是封面,第二个为提示信息,第三个是游戏运行界面 游戏效果展示: 游戏代码展示: snack.c test.c snack.h 控制台程序的准备: 控制台程序名字修改: 参考:…...
【论文阅读笔记】MapReduce: Simplified Data Processing on Large Clusters
文章目录 1 概念2 编程模型3 实现3.1 MapReduce执行流程3.2 master数据结构3.3 容错机制3.3.1 worker故障3.3.2 master故障3.3.3 出现故障时的语义 3.4 存储位置3.5 任务粒度3.6 备用任务 4 扩展技巧4.1 分区函数4.2 顺序保证4.3 Combiner函数4.4 输入和输出的类型4.5 副作用4.…...
LeetCode题练习与总结:二叉树的中序遍历--94
一、题目描述 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 输入:root [1,null,2,3] 输出:[1,3,2]示例 2: 输入:root [] 输出:[]示例 3: 输入:roo…...
云计算十三课
centos安装 点击左上角文件 点击新建虚拟机 点击下一步 点击稍后安装操作系统,下一步 选择Linux(l)下一步 设置虚拟机名称 点击浏览选择安装位置 新建文件夹设置名称不能为中文,点击确定 点击下一步 设置磁盘大小点击下一步…...
[数据集][目标检测]电力场景安全帽检测数据集VOC+YOLO格式295张2类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):295 标注数量(xml文件个数):295 标注数量(txt文件个数):295 标注类别…...
AtCoder Beginner Contest 308 A题 New Scheme
A题:New Scheme 标签:模拟 题意:给定 8 8 8个数的序列,询问这些数是否满足以下条件: 在 100 100 100到 675 675 675之间且能被 25 25 25整除序列是单调非递减的 题解:按题意模拟判断就好了。 代码&#…...
C++编程与朱元墇的关系
学编程和英语没关系,我说这句话,没人会相信,也不会有人说我什么哗众取宠。 我说学编程和朱元墇有关系,一定有人说我放P,其实这个P也和朱元墇有关系, 和朱元墇有什么P关系啊。 真有这P事啊, 朱元…...
0060__设计模式
1. 简单工厂模式( Simple Factory Pattern ) — Graphic Design Patterns 工厂模式 | 菜鸟教程 【设计模式——学习笔记】23种设计模式——建造者模式Builder(原理讲解应用场景介绍案例介绍Java代码实现)-CSDN博客 设计模式—— 五:迪米特…...
【Linux 网络】网络编程套接字 -- 详解
⚪ 预备知识 1、理解源 IP 地址和目的 IP 地址 举例理解:(唐僧西天取经) 在 IP 数据包头部中 有两个 IP 地址, 分别叫做源 IP 地址 和目的 IP 地址。 如果我们的台式机或者笔记本没有 IP 地址就无法上网,而因为…...
编译OpenResty遇到找不到OpenSSL的解决办法
以OpenResty-1.19.9.1为例 编辑openresty-1.19.9.1/build/nginx-1.19.9/auto/lib/openssl/conf CORE_INCS"$CORE_INCS $OPENSSL/.openssl/include" CORE_DEPS"$CORE_DEPS $OPENSSL/.openssl/include/openssl/ssl.h" CORE_LIBS"$CORE_LIBS $OPENSSL/.…...
Amazon Bedrock 托管 Llama 3 8B70B
Amazon Bedrock 托管 Llama 3 8B&70B,先来体验:(*实验环境账号有效期为1天,到期自动关停,请注意重要数据保护) https://dev.amazoncloud.cn/experience/cloudlab?id65fd86c7ca2a0d291be26068&visi…...
海豚调度器早期版本如何新增worker分组
在DolphinScheduler 1.3.5版本中,Worker分组通常是在部署时通过配置文件进行定义的,而不是在用户界面上直接操作。以下是在DolphinScheduler中新增Worker分组的一般步骤: 修改配置文件: DolphinScheduler的Worker分组信息通常在/…...
Debian Linux 下给Nginx 1.26.0 编译增加Brotli算法支持
明月发现参考【给Nginx添加谷歌Brotli压缩算法支持】一文给出的方法,在Debian Linux 12.5下就一直编译失败,主要的错误是因为文件缺失,在专门又安装了apt-get install libbrotli-dev的依赖库后依然会因为文件缺失无法编译完成,就这…...
中国银行从业在线教育系统,如何搭建网课平台?
如今这个时代相信没多少人是没听过网课平台的,绝大多数人对网课平台的名气是如雷贯耳的。时代的发展,让人们学习的方式变得更加的方便与快捷。今天就来和大家说说网课平台搭建都有哪些方法?网课平台难搭建么? 网课平台搭建的方法,其实网课平…...
解决java.lang.IllegalArgumentException异常的正确方法
java.lang.IllegalArgumentException 是 Java 中的一个异常类,表示方法中传递的参数不合法。这个异常通常在方法被调用时抛出,表明方法的参数出现了问题。要正确解决这个异常,你可以按照以下步骤进行: 查看异常信息:首…...
齿轮滚刀刃口钝化技术简介
介绍 在滚刀的使用中发现,进口滚刀和国产滚刀在加工质量和寿命方面存在显著差异。经过多次比较得知,滚刀的使用寿命可以达到国产滚刀的两倍以上,而进口滚刀返回原厂磨削后的使用寿命约为新刀具的90% ,但同样经过国内厂家磨削后&a…...
【ESP32接入ATK-MO1218 GPS模块】
【ESP32接入ATK-MO1218 GPS模块】 1. 引言2. ATK-MO1218 GPS模块概述3. 接入ATK-MO1218 GPS模块的步骤4. 示例代码5. 结论1. 引言 在现代的嵌入式系统和物联网项目中,精确的位置信息是至关重要的。ATK-MO1218 GPS模块作为一款高性能的GPS/北斗双模定位模块,为开发者提供了强…...
EDA设计学习笔记2:STM32F103C8T6最小系统板的仿绘
今日开始仿制练习一个STM32F103C8T6最小系统板,通过对这个最小系统板的仿制,达到对自己PCB设计的练习的目的,最终目标是自己设计出一块PCB,做一个OLED的桌面小摆件...... 也不知道画出来能不能用..... 目录 主控芯片的搜索与放置…...
实现树莓派DS18B20读取温度(OneWire)
简介 使用的是树莓派3B, Go编程实现OneWire方式读取DS18B20温度。 接线 DS18B20 包含经典三线, VCC和GND自不必说, 主要的是DQ线, 需要接4.7K的上拉电阻, 即4.7K欧姆的电阻接到DQ和VCC, 否则树莓派识别不到DS18B20&am…...
tao-8k部署避坑指南:Xinference日志排查、WebUI访问与调用验证
tao-8k部署避坑指南:Xinference日志排查、WebUI访问与调用验证 1. 环境准备与快速部署 在开始部署tao-8k模型之前,我们先来了解一下这个模型的基本情况。tao-8k是由Hugging Face开发者amu研发并开源的专业文本嵌入模型,它能够将文本转换为高…...
Phi-3-mini-4k-instruct-gguf入门必看:q4-GGUF量化对中文语义保留的影响实测
Phi-3-mini-4k-instruct-gguf入门必看:q4-GGUF量化对中文语义保留的影响实测 1. 模型简介 Phi-3-mini-4k-instruct-gguf是微软Phi-3系列中的轻量级文本生成模型GGUF版本,特别适合中文场景下的问答、文本改写、摘要生成等任务。这个经过量化的模型版本在…...
trae中安装mcp报Cannot find package/ERR_MODULE_NOT_FOUND问题
简介 我在trae中安装高德地图的mcp和其他的mcp报出了以下错误,以此记录并分享给大家。 新的改变 node:internal/modules/esm/resolve:204 const resolvedOption FSLegacyMainResolve(pkgPath, packageConfig.main, baseStringified); ^ Error: Cannot find pack…...
PXE装机避坑大全:从TFTP根目录设置到Kickstart无人值守的13个常见错误修复
PXE装机避坑大全:从TFTP根目录设置到Kickstart无人值守的13个常见错误修复 在企业级IT运维中,PXE(预启动执行环境)网络装机技术因其高效、自动化的特点,已成为服务器批量部署的标配方案。但看似简单的PXE部署流程背后&…...
Vivado项目文件太多分不清?这份FPGA开发必备的‘文件后缀速查手册’请收好
Vivado项目文件管理终极指南:从后缀识别到高效工作流 当你第一次打开一个成熟的Vivado项目文件夹时,那种面对几十种陌生文件后缀的茫然感,相信每个FPGA开发者都记忆犹新。就像走进了一个满是神秘符号的仓库,每个文件似乎都在向你发…...
Pi0一键部署教程:nohup后台运行+log实时监控+进程安全终止
Pi0一键部署教程:nohup后台运行log实时监控进程安全终止 本文介绍如何快速部署和运行Pi0机器人控制模型,重点讲解后台运行、日志监控和进程管理的实用技巧,让AI应用稳定运行在服务器环境中。 1. 项目简介:什么是Pi0? …...
终极指南:NanoVG渲染管线深度解析与抗锯齿技术实战
终极指南:NanoVG渲染管线深度解析与抗锯齿技术实战 【免费下载链接】nanovg Antialiased 2D vector drawing library on top of OpenGL for UI and visualizations. 项目地址: https://gitcode.com/gh_mirrors/na/nanovg NanoVG是一款基于OpenGL的轻量级抗锯…...
从特效 SDK 到 AI 动效平台:Neon Vibe Motion 的技术演进之路
多媒体中台在 B 站主要负责剪辑、拍摄、直播等业务场景的动效渲染,开发维护的 SDK 在后文统一称为特效 SDK。 传统的视频特效生产一般分三条链路: 三条链路存在一个困境:效果丰富度、实时可交互、生产效率,三者不可兼得。 那么能…...
ComfyUI ControlNet模型与预处理器搭配秘籍:提升AI绘画精度的关键技巧
ComfyUI ControlNet模型与预处理器搭配秘籍:提升AI绘画精度的关键技巧 在AI绘画领域,ControlNet已经成为精细控制图像生成的重要工具。对于已经熟悉ComfyUI基础操作的用户来说,掌握ControlNet模型与预处理器的搭配技巧,是突破创作…...
路由器、交换机、光猫有什么区别?网络设备基础入门
路由器、交换机、光猫有什么区别?网络设备基础入门前言一、光猫、路由器、交换机分别是干什么的二、三者最核心的区别到底是什么1.它是否直接面对运营商网络?2.它是否负责“让多台设备上网”?3.它是否主要用于扩展有线接口?三、先…...
