当前位置: 首页 > news >正文

电商秒杀系统-案例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 控制台程序的准备: 控制台程序名字修改: 参考&#xff1a…...

【论文阅读笔记】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…...

Windows Audio服务启动报错‘193 0xc1’?可能是系统文件损坏了,试试这个修复流程

Windows音频服务报错‘193 0xc1’深度修复指南:从原理到实战 当你在Windows系统中遭遇音频服务无法启动,并看到神秘的"193 0xc1"错误代码时,这通常意味着系统核心组件出现了问题。不同于普通的驱动故障,这类错误往往需要…...

Armbian编译避坑指南:如何绕过‘Docker不可用’及国内网络依赖问题,成功构建RK3588固件

Armbian编译实战:RK3588平台高效构建与网络优化策略 当国内开发者尝试为RK3588这类高性能ARM平台定制Armbian系统时,往往会遇到两个"拦路虎":Docker环境配置报错和海外资源下载困难。本文将以Rock 5B开发板为例,通过全本…...

Windows触控板驱动终极实战:让苹果设备在Windows平台重获新生

Windows触控板驱动终极实战:让苹果设备在Windows平台重获新生 【免费下载链接】mac-precision-touchpad Windows Precision Touchpad Driver Implementation for Apple MacBook / Magic Trackpad 项目地址: https://gitcode.com/gh_mirrors/ma/mac-precision-touc…...

初次接触Taotoken从注册到发出第一个API请求的全流程耗时

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 初次接触Taotoken从注册到发出第一个API请求的全流程耗时 本文记录了一名新用户从零开始,完成Taotoken平台注册、获取A…...

PCB设计前必知:五种生产工艺方案选型与Layout实战指南

1. 项目概述:PCB设计前必须厘清的生产工艺抉择画板子,尤其是电源板,画得再漂亮,如果生产不出来或者生产成本高得离谱,那一切努力都白费。我见过不少新手工程师,甚至是有些经验的老手,在PCB Layo…...

告别MobaXterm!VSCode Remote-SSH + SFTP插件,实现本地与Linux服务器的无缝代码同步

VSCode全栈远程开发:SSH连接、代码同步与Python环境管理一体化实战 远程开发已成为现代工作流的重要组成部分,但传统工具链的割裂体验让许多开发者头疼。本文将展示如何用VSCode构建完整的远程开发环境,从SSH连接到代码同步,再到P…...

专业级LaTeX排版:深度解析中国科学技术大学学位论文模板括号使用的最佳实践

专业级LaTeX排版:深度解析中国科学技术大学学位论文模板括号使用的最佳实践 【免费下载链接】ustcthesis LaTeX template for USTC thesis 项目地址: https://gitcode.com/gh_mirrors/us/ustcthesis 在学术论文写作中,细节决定专业水准。中国科学…...

GD32 vs STM32:除了参数表,新手选型还得看这几点(附快速上手指南)

GD32与STM32实战选型指南:新手避坑与快速上手指南 当你在电子市场拿起一片GD32开发板和一片STM32开发板时,它们看起来几乎一模一样——同样的引脚排列,同样的封装尺寸,甚至连丝印字体都相似。但当你真正开始项目开发时&#xff0c…...

终极指南:用DDrawCompat在现代Windows上完美复活经典游戏

终极指南:用DDrawCompat在现代Windows上完美复活经典游戏 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh_mirrors/dd/DDr…...

如何通过QuickLookVideo实现Mac视频预览效率革命:终极工具深度解析

如何通过QuickLookVideo实现Mac视频预览效率革命:终极工具深度解析 【免费下载链接】QuickLookVideo This package allows macOS Finder to display thumbnails, static QuickLook previews, cover art and metadata for most types of video files. 项目地址: ht…...