Cookie 和 Session 详解 及实现用户登陆功能

news2024/12/23 11:27:55

Cookie是啥?

浏览器提供的在客户端存储数据的一种机制。(由于浏览器禁止了网页中的代码直接访问磁盘的文件因此要想再网页中实现数据的持久化存储、就可以使用Cookie这样的机制

Cookie 里面存什么?

键值对结构.键和值都是程序猿自定义的~
Cookie从哪里来?

服务器返回响应的时候。可以把要在客户端保存的数据以Set-Cookie这个 header的方式来返回给浏览器~

Cookie到哪里去?

客户端下次访问服务器的时候,就会把之前保存好的cookie再发给服务器~


但是关于Cookie有一个非常典型的使用场景:

使用Cookie来保存用户的登录信息~

很多网站登录成功后,再继续访问这个网站的其他页面,就不需要重新输入用户名密码了~

Cookie

HTTP 协议自身是属于 "无状态" 协议.
"无状态" 的含义指的是:
默认情况下 HTTP 协议的客户端和服务器之间的这次通信, 和下次通信之间没有直接的联系

但是实际开发中, 我们很多时候是需要知道请求之间的关联关系的
例如登陆网站成功后, 第二次访问的时候服务器就能知道该请求是否是已经登陆过了.



 

图中的 "令牌" 通常就存储在 Cookie 字段中

理解会话机制 (Session)

服务器同一时刻收到的请求是很多的. 服务器需要清除的区分清楚每个请求是从属于哪个用户, 就需要在服务器这边记录每个用户令牌以及用户的信息的对应关系.

会话的本质就是一个 "哈希表", 存储了一些键值对结构. key 就是令牌的 ID(token/sessionId), value 就是用户信息(用户信息可以根据需求灵活设计).

sessionId 是由服务器生成的一个 "唯一性字符串", 从 session 机制的角度来看, 这个唯一性字符串称为 "sessionId". 但是站在整个登录流程中看待, 也可以把这个唯一性字符串称为 "token".sessionId 和 token 就可以理解成是同一个东西的不同叫法(不同视角的叫法)

 

  • 当用户登陆的时候, 服务器在 Session 中新增一个新记录, 并把 sessionId / token 返回给客户端.(例如通过 HTTP 响应中的 Set-Cookie 字段返回).
  • 客户端后续再给服务器发送请求的时候, 需要在请求中带上 sessionId/ token. (例如通过 HTTP 请求中的 Cookie 字段带上).
  • 服务器收到请求之后, 根据请求中的 sessionId / token 在 Session 信息中获取到对应的用户信息,再进行后续操作.

Cookie 和 Session 的区别

  • Cookie 是客户端的机制. Session 是服务器端的机制
  • Cookie 和 Session 经常会在一起配合使用. 但是不是必须配合.
  • 完全可以用 Cookie 来保存一些数据在客户端. 这些数据不一定是用户身份信息, 也不一定是token / sessionId
  • Session 中的 token / sessionId 也不需要非得通过 Cookie / Set-Cookie 传递.
  • cookie是客户端(浏览器)存储数据的一种机制.可以存储身份信息,也可以存储别的.都是程序猿自己定义的.
  • session是服务器存储数据的一种机制.也是键值对结构的.主要就是用来存储身份相关的信息的. 


 

 

核心方法

HttpServletRequest 类中的相关方法



 

HttpServletResponse 类中的相关方法


 

 HttpSession 类中的相关方法

一个 HttpSession 对象里面包含多个键值对. 我们可以往 HttpSession 中存任何我们需要的信息.



 

Cookie 类中的相关方法

每个 Cookie 对象就是一个键值对.

 

  •  HTTP 的 Cooke 字段中存储的实际上是多组键值对. 每个键值对在 Servlet 中都对应了一个 Cookie对象.
  • 通过 HttpServletRequest.getCookies() 获取到请求中的一系列 Cookie 键值对.
  • 通过 HttpServletResponse.addCookie() 可以向响应中添加新的 Cookie 键值对.

代码示例: 实现用户登陆


 

 

 

 运行结果:

 

 

 

 

 

 

 

 

重启服务器:

删除cookie

 

 

 

 

 

 

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

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

相关文章

【Java|golang】2325. 解密消息

给你字符串 key 和 message ,分别表示一个加密密钥和一段加密消息。解密 message 的步骤如下: 使用 key 中 26 个英文小写字母第一次出现的顺序作为替换表中的字母 顺序 。 将替换表与普通英文字母表对齐,形成对照表。 按照对照表 替换 mess…

【23 Java后端】小米

一、JavaSE JaveEE —— Java 数据结构 —— 集合类 1. HashMap 底层,链表与红黑树转换原因 JDK 1.7 HashMap 底层使用 “数组链表” 实现,数组为主体,链表为了解决 哈希冲突JDK 1.8 HashMap 底层使用 “数组链表红黑树” 实现 当链表长度…

bootstrap是什么,bootstrap如何使用

bootstrap是什么 Bootstrap 是最受欢迎的 HTML、CSS 和 JS 框架,用于开发响应式布局、移动设备优先的 WEB 项目。 使用bootstrap 下载地址

Power BI散点图

散点图可以让一大堆令人困惑的散乱数据变得通俗易懂,并能让你从这些庞杂数据中发现一些表面上看不到的关系,数据量越大,从散点图的分布中越能看出来一些规律。 什么是散点图 在直角坐标系中,用两组数据构成多个坐标点&#xff0…

【无标题】质量管理10题

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

使用 WSL2 进行 Go 开发

文章目录1. 安装 WSL22. 配置 Ubuntu 环境配置 root 用户密码设置默认 root3. 配置 Go 环境下载 SDK配置环境变量配置 GOPROXY4. 使用 GoLand 进行开发由于 kitex 目前对 Windows 下自动生成代码适配不完善,因此使用 WSL2 进行 Go 的开发,在配置 WSL2 环…

IEEE参考文献格式生成 之 谢谢你Zotero!

谢谢你Zotero!心酸的开始方法1(有文献pdf)方法2(无文献pdf)方法3(自己写)怎么找到bib文件呢?期刊论文会议论文书籍(专著)心酸的开始 一开始在看到论文模板的…

20230202英语学习

How James Webb Space Telescope Changed Astronomy in Its First Year 你最爱的这些绝美图像,正在改变宇宙学 The most pressing aim of JWST is one of the most ambitious projects in the recent history of astronomy: to look back at some of the first ga…

力扣刷题记录——1078. Bigram 分词、1207. 独一无二的出现次数 、1089. 复写零

本专栏主要记录力扣的刷题记录,备战蓝桥杯,供复盘和优化算法使用,也希望给大家带来帮助,博主是算法小白,希望各位大佬不要见笑,今天要分享的是——《力扣刷题记录——1078. Bigram 分词、1207. 独一无二的出…

python面向对象:三大特性

python面向对象三大特性:继承、封装、多态 文章目录python面向对象三大特性:继承、封装、多态一、实验目的二、实验原理三、实验环境四、实验内容五、实验步骤1.封装2.继承3.多态总结一、实验目的 掌握类的封装、多态、继承 二、实验原理 面向对象的三…

Python爬虫3-数据解析方法:正则表达式介绍及案例

目录标题1、正则表达式介绍re库的主要功能函数Re库的match对象Re库的贪婪匹配和最小匹配2、正则表达式案例案例1:所有图片爬取案例2:分页爬取案例3:淘宝商品信息案例4:股票数据1、正则表达式介绍 正则表达式re:简洁表达一组字符串…

PCIe设备的配置过程

PCIe设备的配置过程 文章目录PCIe设备的配置过程参考资料:一、 PCIe系统硬件结构二、 PCIe系统软件层次三、事务层TLP格式3.1 Posted和Non-Posted3.2 TLP通用格式3.3 TLP头部四. 配置与RC直连的设备4.1 怎么访问直连的设备4.2 配置EendPoint五、 配置示例5.1 必备知…

PPT绘图笔记2:PPT导出图片结合ps处理图片

ppt导出的图片有透明背景怎么办?我使用的是组合图。 一开始以为是我的分辨率不行,按照官网的说明在注册表上进行修改1。 然后我在查资料的时候在B站看到一个方法可以用ps填充白色背景,并且修改分辨率.首先导入到ps调整的方法2,记…

AXI 总线协议学习笔记(3)

引言 上篇文章主要介绍了 AMBA以及AXI协议的基本内容,本文接续前文,继续介绍AXI协议的 原子访问、传输行为和事务顺序等。 AXI 总线协议学习笔记(2)https://blog.csdn.net/qq_43045275/article/details/128824643 原子访问 原子…

SpringBoot系列 整合MyBatisPlus入门

官网&#xff1a; https://mybatis.plus/ https://mp.baomidou.com/ 由于MyBatisPlus并未被收录到idea的系统内置配置&#xff0c;无法直接选择加入 pom <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-sta…

【string类的简单模拟实现】

目录 1 类中成员变量的声明 2 迭代器 3 一些常用接口 4 六大默认函数 4.1 构造 4.2 拷贝构造 4.3 赋值运算符重载 4.4 析构 5 开空间&&增删查改 6 其他运算符重载 1 类中成员变量的声明 通过上一篇文章对string类的简单使用相信大家对于string类中成员变量已…

Android so库开发——Swig工具使用(五)

SWIG 是一种软件开发工具&#xff0c;它将 C 和 C 编写的程序与各种高级编程语言连接起来。这里我们用它来将 C/C 转换成 Java。 一、Swig安装 1、下载 官网&#xff1a;SWIG官网下载 源码链接 GitHub&#xff1a;https://github.com/swig/swig.git 这两个地址可能会出现无…

关于Java中的BigDecimal

文章目录为什么用BigDecimalBigDecimal构造方法通过静态方法创建BigDecimal对象BigDecimal常用API关于除法运算的roundingMode将BigDecimal转换为基本类型代码展示小结其他文章为什么用BigDecimal 使用float、double及其对应的包装类时&#xff0c;运算精度可能不满足需求 flo…

scrollTo() 无效问题处理

需求&#xff1a; 实现访问当前页面直接滚动到最底部 方案&#xff1a;window对象的scrollTo()方法 API介绍&#xff1a; 参数接收一个点&#xff08;文档坐标&#xff09;&#xff0c;让该点位于左上角。 可选参数为behavior(设置滚动的效果&#xff09; 错误案例&#xff1a;…

【My Electronic Notes系列——数制与编码】

目录 序言&#xff1a; &#x1f3c6;&#x1f3c6;人生在世&#xff0c;成功并非易事&#xff0c;他需要破茧而出的决心&#xff0c;他需要永不放弃的信念&#xff0c;他需要水滴石穿的坚持&#xff0c;他需要自强不息的勇气&#xff0c;他需要无畏无惧的凛然。要想成功&…