理解HttpSession

news2024/11/26 11:52:59

什么是session

在我刚刚从事后端开发的时候,有一个问题困扰了我很久。
就有个玩意叫session。

   @PostMapping("login")
    public Result login(
    @RequestParam("id") String id,
    @RequestParam("password") String password,  
    HttpSession session) {
    .......
    }

每一个java程序员入门的时候。都会遇到这段代码。 刚刚开始接触后端开发,最最最简单 也最典型的入门 就是开发一个登录功能。
我容易理解的是 前端传一个请求过来会映射到这个方法,id 密码是前端输入之后传过来的。
然后我就懵逼了 我擦 这个HttpSession session玩意是从哪里冒出来的???这不是前端的参数列表吗??? 前端什么时候传了这么个玩意???


在解释HttpSession 之前,我们要理解一个东西 就是

Http 协议

在客户端和服务端 使用Http协议通信的时候,http协议的请求都是无状态的。 所谓无状态就是 它不会保留上一次请求的信息。每个HTTP请求都是独立的,服务器不会在不同的请求之间保存任何关于客户端的状态信息。这意味着服务器在处理每个请求时不会考虑之前的请求,也不会跟踪客户端的状态。每个请求都是相互独立的,服务器无法知道两个请求是否来自同一个客户端。

比如登录淘宝app 成功登进去了。 这就是一次http请求。

但是当你再发一次购物请求的时候, 对不起 淘宝的服务端 已经不认识你了。
除非给你一个窗口 你把刚才登录的用户名密码再发一遍 这样它就知道还是第一次登录的你了。

这就意味这 你在淘宝里面 做任何一次请求交互类的行为, 你都得把刚才登录的用户名密码再发一遍 。

这也太痛苦了对吧。

所以早期的网络交互技术中 就诞生了 session 的概念。 它就像一个短期的盒子 暂时让服务器记住你。 这样你就不用每次都带上用户名密码 让服务端认识你了。


在这里插入图片描述

当用户第一次访问服务端的时候, 服务器 会为他创建一个session。
这个session 你可以把它理解成一个 map结构。 它里面有key:sessionid 作为它的主键标识。 还有key是创建时间。比如

public String getId():返回包含唯一标识符值的字符串。
public long getCreationTime():返回创建此会话的时间,自格林威治标准时间 1970 年 1 月 1 日午夜起以毫秒为单位测量。
public long getLastAccessedTime():返回客户端最后一次发送与此会话关联的请求的时间,作为自格林威治标准时间 1970 年 1 月 1 日午夜以来的毫秒数。
public void invalidate():使这个会话无效,然后解除绑定到它的任何对象。

有意思的时候 你可以往这个session里面扔 key-value。 让它帮你存用户信息。你随时可以去取。 直到这个用户的访问会话结束 它才会销毁。

而服务器创建好session之后 它会把这个session id 发给前端。 存储在前端的cookie里面。

ok 现在回到那个淘宝的场景:

你登录之后 。第二次访问要买东西,不是无状态协议 第二次访问 服务器就不认识我了吗?? 这次我带着你给我的session id去找你。 通过session id 取出我第一次登录的时候存在session里面的信息。

你就认识我了对吧。


这就是 HttpSession , 所以当我们看到这段代码的时候要理解:

   @PostMapping("login")
    public Result login(
    @RequestParam("id") String id,
    @RequestParam("password") String password,  
    HttpSession session) {
    .......
    }

这个session 不是前端传过来的。 是后端你的tomcat服务器创建好之后 给你的, 你可以用也可以不用,看你的需要。


拓展

这里再给新玩家拓展一下, 你有没有想过 既然session是服务器创建的,那如果有多台服务器呢? 前端发一个请求过来, 后端有3个tomcat,使用nginx做负载均衡。 这时候你只有一台tomcat存了session 另外2台 第二次请求的时候还是 不认识你, 这时候怎么办呢?

解决思路有很多 常见的有两种:

  • 多台tomcat之间 有session拷贝就可以 同步数据。(就像mysql集群同步数据一样)
  • 使用redis来代替session 实现相同的功能(不知道redis的时候 可以去了解一下)

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

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

相关文章

哈希及模拟实现

文章目录 哈希1. 哈希相关概念1.1 哈希概念1.2 哈希冲突1.3 哈希函数1.4 哈希冲突解决1.4.1 闭散列/开放定址法(1)线性探测(2) 二次探测 1.4.2 开散列/哈希桶 2. 开放定址法的实现2.1 结构2.2 插入Insert2.2.1 传统写法2.2.2 现代写法 2.3 查找Find2.4 删除Erase2.5 整体代码 3…

springcloud基于web的智慧养老平台

系统分析 可行性分析 在开发系统之前要进行系统可行性分析,目的是在用最简单的方法去解决最大的问题,程序一旦开发出来满足了用户的需要,所带来的利益也很多。下面我们将从技术、操作、经济等方面来选择这个系统最终是否开发。 1、技术可行…

一图看懂 dateutil 模块:Python datetime 模块的扩展,资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创,转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 dateutil 模块:Python datetime 模块的扩展,资料整理笔记(大全) 🧊摘要🧊模块图🧊类关系…

005、数据库结构

数据库结构 1、数据库集簇逻辑结构2、对象标识符3、数据库集簇物理结构4、其它目录结构表空间物理文件位置1、数据库集簇逻辑结构 • 数据库集簇逻辑结构 数据库 : 把数据逻辑分开存放。 对象是放在数据库当中。表空间: 把数据从逻辑或者物理上分割存放2、对象标识符 Postg…

Weblogic SSRF 漏洞(CVE-2014-4210)

SSRF漏洞 ​ SSRF(服务端请求伪造),指的是攻击者在未能取得服务器所有权限时,利用服务器漏洞以服务器的身份发送一条构造好的请求给服务器所在内网。SSRF攻击通常针对外部网络无法直接访问的内部系统。 ​ 简单的说就是利用一个可…

《统计学习方法》——隐马尔可夫模型(下)

学习算法 HMM的学习,在有观测序列的情况下,根据训练数据是否包含状态序列,可以分别由监督学习算法和无监督学习算法实现。 监督学习算法 监督学习算法就比较简单,基于已有的数据利用极大似然估计法来估计隐马尔可夫模型的参数。…

详解二叉树

🌈目录 一、树形结构​ 🌳1.1 概念1.2 其他概念1.3 树的表示形式 二、二叉树✨2.1 概念2.2 两种特殊二叉树2.3 性质2.4 二叉树存储 三、二叉树的基本操作🙌3.1 前置说明3.2 二叉树的遍历3.3 二叉树的基本操作 四、二叉树的OJ✍️ 一、树形结构…

springboot+vue医院信管系统(源码+文档)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的医院信管系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者:风歌&a…

Service Control Manager 服务管理器简介

在windows驱动开发流程中,写完sys驱动binary之后,为了让OS能够正确的从注册表中读取到对应的信息,并且将其load运行起来,还需要编写inf文件来描述配置驱动文件。不过这也不是必须的,可以通过ServiceControlManager直接…

Fiddler 抓包工具 - 全网最全最细教程,没有之一

Fiddler 简介 Fiddler 是位于客户端和服务器端的 HTTP 代理 目前最常用的 http 抓包工具之一 功能非常强大,是 Web 调试的利器 监控浏览器所有的 HTTP/HTTPS 流量 查看、分析请求内容细节 伪造客户端请求和服务器响应 测试网站的性能解密 HTTPS 的 Web 会话 全局…

Go语音基于zap的日志封装

zap日志封装 Zap是一个高性能、结构化日志库,专为Go语言设计。它由Uber开源,并且在Go社区中非常受欢迎。它的设计目标是提供一个简单易用、高效稳定、灵活可扩展的日志系统。 以下是Zap的一些主要特点: 1.高性能:Zap的性能非常出…

【Linux】权限的理解

🌇个人主页:平凡的小苏 📚学习格言:命运给你一个低的起点,是想看你精彩的翻盘,而不是让你自甘堕落,脚下的路虽然难走,但我还能走,比起向阳而生,我更想尝试逆风…

mysql exist和in的区别

一、演示用的表 为了演示二者的区别,先建立两张表 user 表和 order 表 二、in 的执行情况 in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,…

接口测试之Jenkins+Jmeter+Ant实现持续集成

安装Jenkins,见手把手教小白安装Jenkins_程序员馨馨的博客-CSDN博客 一)Linux机器上安装Jmeter 百度一下就好 二)Linux机器上安装Ant 1、下载安装包 进入Apache Ant - Binary Distributions,下载安装包,本次安装的是版…

高仿某东商城flutter版本,个人学习flutter项目

前言 高仿某东商城flutter版本,个人学习flutter项目 使用flutter_redux状态管理网络使用dio进行了简单的封装使用node项目mock服务端接口(mock_server目录)目前只实现了首页,其他功能持续更新… 同款Android Kotlin版本( https://github.co…

Mysql索引底层原理及其优化方案

1.深入理解Mysql索引底层数据结构与算法 1.1索引结构 索引及其数据结构: 二叉树红黑树Hash表B-Tree 1.1 二叉树 说明:二叉树是建立数据后,会和第一元素进行比对,当比较的元素小于第一个元素时,此时就会走第一个元素…

代码随想录算法训练营第四十三天 | 填满背包有几种方法、背包有两个维度

1049.最后一块石头的重量II 文档讲解:代码随想录 (programmercarl.com) 视频讲解:动态规划之背包问题,这个背包最多能装多少?LeetCode:1049.最后一块石头的重量II_哔哩哔哩_bilibili 状态:没想到。 思路 本…

chatgpt如何引入领域知识?mit团队利用gpt4做数据增强来提升小模型在特定领域的效果

一、概述 title:Dr. LLaMA: Improving Small Language Models in Domain-Specific QA via Generative Data Augmentation 论文地址:Paper page - Dr. LLaMA: Improving Small Language Models in Domain-Specific QA via Generative Data Augmentation…

(6)LED点阵屏

LED点阵屏由若干个独立的LED组成,LED以矩阵的形式排列,以灯珠亮灭来显示文字、图片、视频等。LED点阵屏广泛应用于各种公共场合,如汽车报站器、广告屏以及公告牌等 LED点阵屏分类 按颜色:单色、双色、全彩按像素:88、…

Excel模板导入导出功能测试点

近期接触的都是Web项目,有很多导入数据这个功能,导入的文件格式都是Excel,基本流程就是:下载一个Excel模板,填充数据,再将Excel表格导入,导入后可下载列表,想着这类功能的测试点基本…