登录认证(3):会话跟踪技术:Session

news2025/1/23 14:47:45

Session概览

上文提到了,为了在同一个会话中共享数据(比如用户的登录状态),我们需要使用会话跟踪技术Cookie客户端的会话跟踪技术,是存储在本地浏览器中的。而本文介绍另外一种会话跟踪技术Session,是基于Cookie实现的技术,是存储在服务端的服务端的会话跟踪技术

使用Session

获取Session

如果需要基于Session进行会话跟踪,那么需要在浏览器第一次请求服务器时,在服务端创建一个会话对象Session,而每一个Session会话对象,都有一个独一无二的ID,如图所示:Session括号中的1就表示该Session的id,称为Session的id

响应Cookie(JSession)

在服务端成功创建一个Session之后,在给浏览器响应数据的时候,会通过CookieSession的ID 响应给浏览器。其原理也是通过响应头:Set-Cookie完成的。上文提到,Set-Cookie响应头是用来响应Cookie的,也可以用于响应Session,这是因为Cookie的名字是固定的,通过JSESSIONID代表Session的ID,当浏览器看到响应头中的Cookie名是JSESSIONID时,就能自动将其识别为Session并将这个Cookie存储在本地浏览器,其原理如图所示:

查找Session

Cookie存储在本地浏览器之后,后续的每一次请求,都会将Cookie中的数据获取出来,通过请求头Cookie将其携带到服务端,服务端成功获取到JSESSIONID这个cookie的值,也就是Session的独一无二的id值之后,就会从 服务端中的众多Session中进行比对,寻找到当前请求对应的Session ,这样我们就可以通过Session会话对象在同一次会话中的多次请求之间共享数据了,这就是基于Session进行会话跟踪的流程。

从中不难看出:在大部分情况下Session的底层是基于Cookie实现的,二者的使用逻辑、工作原理几乎是相同的。但是Cookie是存放在本地浏览器的;而Session是存放在服务器端的。

Session测试代码

在服务端创建Session响应前端

/**
 * 创建Session
 * @param session 在服务端创建Session对象
 * @return Result<Void>
 */
@GetMapping("/s1")
public Result<Void> setSession(HttpSession session) {
    log.info("set-HttpSession: {}", session.hashCode());
    // 在session中存储数据
    session.setAttribute("login_user", "tom");
    return Result.success();
}

我们可以直接操作HttpSession对象封装响应给客户端Session数据,通过其自带的setAttribute方法可以便捷封装数据,此时访问/s1查看:

可以看见,服务端成功响应一个名为JSESSIONCookie以后的每一次请求,都会携带这个Cookie ,服务端会根据JSESSIONID,去寻找对应的Session

在服务端查找对应Session

/**
 * 获取Session中数据
 * @param request 请求数据封装的对象
 * @return Result<Void>
 */
@GetMapping("/s2")
public Result<Object> getSession(HttpServletRequest request) {
    HttpSession session = request.getSession();
    log.info("get-HttpSession: {}", session.hashCode());

    Object loginUser = session.getAttribute("login_user");
    log.info("login_user: {}", loginUser);
    return Result.success(loginUser);
}

服务端中可以直接操作HttpServletRequest对象,获取这次请求中所携带的Session,并使用getAttribute方法便捷的获取Session中的数据,服务端查找对应的Session是根据Session的唯一标识ID查找到的。此时访问/s2查看:

对比响应请求中的两个CookieJSESSIONID可以发现,是使用的同一个Session,查看控制台日志 发现,服务端成功查找到对应的Session成功获取到对应的数据: 

这说明通过Session进行同一次会话中的多次请求共享数据是理论可行的,但真的可行吗?

Session实际不可行

不适应集群环境

现在的大部分项目部署,为了避免单点故障,都不会只部署在一台服务器上,而是通过集群的形式进行部署,一个项目会部署在多台服务器上,每一台部署的内容是一样的。通过负载均衡服务器对用户的请求进行调度,将请求按照服务器的负载,尽量均匀的分配到每一台服务器上:

假如说通过Session技术进行会话跟踪,那么就有可能出现这样的情况:假如第一次用户登录请求,负载均衡服务器分配到了服务器1,用户完成了登录,在服务器1存储了一个Session,并将其响应给客户端,以便于每一次请求都携带Cookie;用户登录之后开始发送其他请求,此时请求被负载均衡服务器分配到了服务器2,但Session是在服务器1的,服务器2无法识别请求头中的Cookie,所以说判断用户未登录,然后用户又必须登录一次。假如服务器集群十分大,这样的情况就更是频繁。

底层基于Cookie实现

同时,由于在大部分情况下Session的底层是基于Cookie实现的,所以说Cookie的局限,Session都是有的。 所以说在实际开发中,Session使用十分局限。

总结

在大部分情况下,Session的底层是基于Cookie实现的,是在存储在服务端的会话跟踪技术,但由于不适应服务器集群有Cookie的缺点等局限性,所以使用得并不多。总而言之,不论是Cookie还是Session,在实际开发中的使用都比较少,现在大多是通过令牌技术来实现会话跟踪的,且听下回分解。

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

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

相关文章

2024年博客之星年度评选|第一步——创作影响力评审入围Top300名单 | 博客之星陪跑指南

2024年博客之星年度评选&#xff5c;第一步——创作影响力评审入围Top300名单 | 博客之星陪跑指南 2024年博客之星年度评选正在如火如荼地进行中&#xff01;作为博客圈最具影响力的评选活动之一&#xff0c;今年的评选吸引了众多优秀博主的参与。现在&#xff0c;距离Top300入…

ui文件转py程序的工具

源博客连接&#xff1a; PyCharm中利用外部工具uic转成的py文件&#xff0c;里面全是C代码&#xff0c;并非python类型的代码&#xff0c;导致大量报错。。。_pyside6-uic为什么把ui转为了c-CSDN博客 如果想把ui文件转为py文件&#xff0c;首先设置pycharm的外部工具&#xf…

【喜讯】海云安荣获“数字安全产业贡献奖”

近日&#xff0c;国内领先的数字化领域独立第三方调研咨询机构数世咨询主办的“2025数字安全市场年度大会”在北京成功举办。在此次大会上&#xff0c;海云安的高敏捷信创白盒产品凭借其在AI大模型技术方面的卓越贡献和突出的技术创新能力&#xff0c;荣获了“数字安全产业贡献…

FluentCMS:基于 ASP.NET Core 和 Blazor 技术构建的开源CMS内容管理系统

推荐一个基于 ASP.NET Core 和 Blazor 技术构建的、功能完善的开源CMS内容管理系统。 01 项目简介 FluentCMS 是一个基于强大的 ASP.NET Core 和创新的 Blazor 技术构建的现代内容管理系统&#xff08;CMS&#xff09;。 FluentCMS 设计为快速、灵活且用户友好&#xff0c;它…

Java实现简易银行账户管理系统

目录 1、项目概述 1.1 项目结构 1.2 技术栈 2、核心功能说明 2.1 账户管理 2.2 异常处理体系 3、设计理念解析 3.1 面向对象设计 3.2 关键设计点 4、使用指南 4.1 运行流程 4.2 注意事项 5、扩展建议 5.1增加功能 5.2优化方向 6、主要的功能模块代码说明 6.1exception 6.2main …

深度学习系列75:sql大模型工具vanna

1. 概述 vanna是一个可以将自然语言转为sql的工具。简单的demo如下&#xff1a; !pip install vanna import vanna from vanna.remote import VannaDefault vn VannaDefault(modelchinook, api_keyvanna.get_api_key(my-emailexample.com)) vn.connect_to_sqlite(https://va…

C# 网络协议第三方库Protobuf的使用

为什么要使用二进制数据 通常我们写一个简单的网络通讯软件可能使用的最多的是字符串类型&#xff0c;比较简单&#xff0c;例如发送格式为(head)19|Msg:Heart|100,x,y,z…&#xff0c;在接收端会解析收到的socket数据。 这样通常是完全可行的&#xff0c;但是随着数据量变大&…

网络安全 | 什么是正向代理和反向代理?

关注&#xff1a;CodingTechWork 引言 在现代网络架构中&#xff0c;代理服务器扮演着重要的角色。它们在客户端和服务器之间充当中介&#xff0c;帮助管理、保护和优化数据流。根据代理的工作方向和用途&#xff0c;代理服务器可分为正向代理和反向代理。本文将深入探讨这两种…

Python 预训练:打通视觉与大语言模型应用壁垒——Python预训练视觉和大语言模型

大语言模型是一种由包含数百亿甚至更多参数的深度神经网络构建的语言模型&#xff0c;通常使用自监督学习方法通过大量无标签文本进行训练&#xff0c;是深度学习之后的又一大人工智能技术革命。 大语言模型的发展主要经历了基础模型阶段(2018 年到2021年)、能力探索阶段(2019年…

AIGC视频生成模型:Meta的Emu Video模型

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍Meta的视频生成模型Emu Video&#xff0c;作为Meta发布的第二款视频生成模型&#xff0c;在视频生成领域发挥关键作用。 &#x1f33a;优质专栏回顾&am…

定位,用最通俗易懂的方法2.1:CRLB实例

二郎就不设置什么VIP可见啥的了&#xff0c;这样大家都能看到。 如果觉得受益&#xff0c;可以给予一些打赏&#xff0c;也算对原创的一些鼓励&#xff0c;谢谢。 钱的用途&#xff1a;1&#xff09;布施给他人&#xff1b;2&#xff09;二郎会有更多空闲时间写教程 起因&…

python学习笔记3-字符串常用的方法

一、判断&#xff08;9个&#xff09;&#xff1a; 二、查找和替换&#xff08;8个&#xff09; 三、⼤⼩写转换&#xff08;5个&#xff09; 四、⽂本对⻬&#xff08;3个&#xff09; 五、去除空⽩字符&#xff08;3个&#xff09; 六、拆分和连接 &#xff08;6个&#xff0…

【FreeRTOS 教程 一】任务结构体及其基础创建使用

目录 一、任务与协程的区别&#xff1a; &#xff08;1&#xff09;任务的特点&#xff1a; &#xff08;2&#xff09;协程的特点&#xff1a; &#xff08;3&#xff09;总结&#xff1a; 二、任务概述 &#xff1a; &#xff08;1&#xff09;任务状态&#xff1a; &…

node.js 07.npm下包慢的问题与nrm的使用

一.npm下包慢 因为npm i 默认从npm官网服务器进行下包,但是npm官网服务器是海外服务器所以响应很慢. 于是我们通过npm下包的时候通常用淘宝镜像进行下包,下面是切换到淘宝镜像地址下包的操作. 二.nrm的使用 nrm是一个管理切换npm下包地址的工具,可以快速切换下包的地址. 安…

2025发文新方向:AI+量化 人工智能与金融完美融合!

2025深度学习发论文&模型涨点之——AI量化 人工智能的融入&#xff0c;使量化交易实现了质的突破。借助机器学习、深度学习等先进技术&#xff0c;人工智能可高效处理并剖析海量市场数据&#xff0c;挖掘出数据背后错综复杂的模式与趋势&#xff0c;从而不仅提升了数据分析…

【16届蓝桥杯寒假刷题营】第1期DAY5

5.依依的询问最小值 - 蓝桥云课 问题描述 依依有个长度为 n 的序列 a&#xff0c;下标从 1 开始。 她有 m 次查询操作&#xff0c;每次她会查询下标区间在 [li​,ri​] 的 a 中元素和。她想知道你可以重新排序序列 a&#xff0c;使得这 m 次查询的总和最小。 求你求出 m 次…

25/1/15 嵌入式笔记 初学STM32F108

GPIO初始化函数 GPIO_Ini&#xff1a;初始化GPIO引脚的模式&#xff0c;速度和引脚号 GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化GPIOA的引脚0 GPIO输出控制函数 GPIO_SetBits&#xff1a;将指定的GPIO引脚设置为高电平 GPIO_SetBits(GPIOA, GPIO_Pin_0); // 将GPIO…

C语言--数据在内存中的存储

数据在内存中的存储 主要研究整型和浮点型在内存中的存储。 1. 整数在内存中的存储 在学习操作符的时候&#xff0c;就了解过了下面的内容&#xff1a; 整数的2进制表示方法有三种&#xff0c;即原码、反码和补码。 有符号的整数&#xff0c;三种表示方法均有符号位和数值…

DRG_DIP 2.0时代医院程序结构转型与数据结构优化研究

一、引言 1.1 DRG_DIP 2.0 改革背景与意义 医保支付方式改革在医疗保障制度改革中占据着极为关键的地位&#xff0c;是推动医疗领域变革的核心力量。它犹如一把精准的手术刀&#xff0c;对医疗资源的合理分配、医疗服务质量的稳步提升以及医疗费用的有效控制起着决定性作用。…

炸场硅谷,大模型“蒸汽机”迎来“瓦特时刻”

作者 | 曾响铃 文 | 响铃说 中国大模型又在包括硅谷在内的全球AI圈炸场了。 两天前&#xff0c;幻方量化旗下AI公司深度求索&#xff08;DeepSeek&#xff09;&#xff0c;以及月之暗面相隔20分钟相继发布了自家最新版推理模型&#xff0c;分别是DeepSeek-R1以及Kimi 全新多…