【JavaEE】Cookie和Session详解

一.Cookie

  • 首先我们知道HTTP协议本身是’‘无状态’‘的, 这里的’‘无状态’'指的是:默认情况下HTTP协议的客户端和服务器之间的这次通信,和下次通信之间没有直接的联系. 但是在实际的开发过程之中, 我们很多时候是需要知道请求之间的关联关系的. 例如登陆网站成功后,第二次访问的时候服务器就能知道该请求是否是已经登录过了. 换句话说,假设你刚从浏览器上登录了你的LeetCode账号,然后把该页面关掉,一段时间之内你再次进入时就不需要再次输入账号密码了
  • 用图表示上述过程就是:在这里插入图片描述
  • 上述途中的’‘令牌’'通常就存储在Cookie字段中.
    • 举个例子:比如去医院挂号.
        1. 看病之前先挂号, 挂号的时候需要提供身份证证件, 此时你就获得了一张"就诊卡", 这个就诊卡就相当于患者的"令牌". 此时医院的系统之中就会存储你的身份信息.
        1. 后续去各个科室进行检查诊断,开药等操作, 都不比在出示身份证件了, 只要有就诊卡即可识别出当前患者的身份了.
        1. 看完病之后, 不想要就诊卡了, 就可以注销这个卡, 此时患者的身份就和就诊卡的关联就销毁了, 医院之中的系统就不会再记录这个数据了, 再次拿这个卡去看病就会不起作用了 (类似于网站的注销操作).
        1. 如果下次再来看病, 就需要再办一张就诊卡, 此时就相当于又获得一一张’‘令牌’’

此时在服务器(医院)这边就需要记录"令牌"信息, 以及令牌对应的用户信息, 这个就是 Session 机制所做的工作.

二.Session

理解会话.

  • 会话也是对话的意思.
    在这里插入图片描述

  • 在计算机领域, 会话是一个客户与服务器之间的不中断的请求响应. 对客户的每个请求,服务器能够识别出请求来自于同一个客户. 当一个未知的客户向Web应用程序发送第一个请求时就开始了一个会话. 当客户明确结束会话或服务器在一个时限内没有接受到客户的任何请求时,会话就结束了.

    • 比如我们打客服电话. 每次打客服电话, 就是一个会话. 挂断电话, 会话就结束了
      下次再打客服电话, 就又是一个新的会话. 如果我们长时间不说话, 没有新的请求, 会话也会结束.
  • 服务器同⼀时刻收到的请求是很多的. 服务器需要清楚的区分每个请求是从属于哪个用户, 也就是属于哪个会话, 就需要在服务器这边记录每个会话以及与用户的信息的对应关系.Session是服务器为了保存用户信息而创建的一个特殊的对象.

在这里插入图片描述

  • Session的本质就是⼀个 “哈希表”, 存储了⼀些键值对结构. Key 就是SessionID, Value 就是用户信息(用户信息可以根据需求灵活设计).
    在这里插入图片描述

SessionId

  • ==SessionId 是由服务器生成的一个 “唯一性字符串”, 从 Session 机制的角度来看, 这个唯一性字符串称为 “SessionId”. 但是站在整个登录流程中看待, 也可以把这个唯一性字符串称为 “token”. ==上述例子中的令牌ID, 就可以看做是SessionId, 只不过令牌除了ID之外, 还会带一些其他信息, 比如时间, 签名等.

在这里插入图片描述

SessionId是如何产生的

  1. 当用户登陆的时候, 服务器在 Session 中新增一个新记录, 并把 sessionId返回给客户端. (通过HTTP 响应中的 Set-Cookie 字段返回).
  2. 客户端后续再给服务器发送请求的时候, 需要在请求中带上 sessionId. (通过HTTP 请求中的Cookie 字段带上).
  3. 服务器收到请求之后, 根据请求中的 sessionId在 Session 信息中获取到对应的用户信息, 再进行后续操作.找不到则重新创建Session, 并把SessionId返回.
    在这里插入图片描述

注:
Session 默认是保存在内存中的. 如果重启服务器则 Session 数据就会丢失.

三.Cookie 和 Session 的区别

  • Cookie 是客户端保存用户信息的一种机制. Session 是服务器端保存用户信息的一种机制.
  • Cookie 和 Session之间主要是通过 SessionId 关联起来的, SessionId 是 Cookie 和 Session 之间的桥梁
  • Cookie 和 Session 经常会在一起配合使用. 但是不是必须配合.
    • 完全可以用Cookie 来保存⼀些数据在客户端. 这些数据不一定是用户身份信息, 也不一定是SessionId.
    • Session 中的sessionId 也不需要非得通过 Cookie/Set-Cookie 传递, 比如通过URL传递.

四.Cookie的存储和读取

方法一:传统的获取Cookie的方式.

@RequestMapping("/getCookie1")public String getCookie(HttpServletRequest request, HttpServletResponse response) {//获取参数//String name = request.getParameter("name");Cookie[] cookies = request.getCookies();if (cookies != null) {Arrays.stream(cookies).forEach(cookie -> {System.out.println(cookie.getName()+":"+cookie.getValue());});}return "获取cookie成功";}
  • Spring MVC是基于 Servlet API 构建的原始 Web 框架, 也是在Servlet的基础上实现的. HttpServletRequest , HttpServletResponse 是Servlet提供的两个类, 是Spring MVC方法的内置对象. 需要时直接在方法中添加声明即可.
  • HttpServletRequest 对象代表客户端的请求, 当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息.
  • HttpServletResponse 对象代表服务器的响应. HTTP响应的信息都在这个对象中, 比如向客户端发送的数据, 响应头, 状态码等. 通过这个对象提供的方法, 可以获得服务器响应的所有内容. Spring MVC在这两个对象的基础上进行了封装, 给我们提供更加简单的使用方法.
    测试结果:
    在这里插入图片描述

方法二:使用注解的方式获取Cookie.

	@RequestMapping("/getCookie2")public String getCookie2(@CookieValue("bite") String result){return "获取到cookie值了,value:"+result;}

五.Session的存储和读取

1.Session存储

 	@RequestMapping("/setSession")public String setSession(HttpServletRequest request, HttpServletResponse response) {//先从cookie中获取到sessionId,再根据sessionId获取session对象,如果没有获取到,就会自己创建一个session对象HttpSession session = request.getSession();session.setAttribute("name","zhangsan");return "Session设置成功~~";}

这个代码中看不到 SessionId 这样的概念的. getSession 操作内部提取到请求中的Cookie 里的SessionId, 然后根据SessionId获取到对应的Session 对象, Session 对象用HttpSession来描述
在这里插入图片描述

2.Session读取.

方法一

	@RequestMapping("/getSession1")public String getSession1(HttpServletRequest request, HttpServletResponse response) {//先从cookie中获取到sessionId,再根据sessionId获取session对象HttpSession session = request.getSession();String name = (String)session.getAttribute("name");return "获取到session的值了 name:"+name;}
  • 通过fiddler观察请求的详细情况:
    在这里插入图片描述
    可以看到, HTTP响应中, 通过Set-Cookie告知客⼾端, 把SessionID存储在Cookie中
  • 通过浏览器, 可以观察到运行结果: 在这里插入图片描述
    通过Fiddler观察Http请求和响应
    在这里插入图片描述
    可以看到, Http请求时, 把SessionId通过Cookie传递到了服务器

方法二:

	@RequestMapping("/getSession2")public String getSession2(HttpSession session, HttpServletResponse response) {String name = (String)session.getAttribute("name");return "获取到session的值了 name:"+name;}

方法三:

	@RequestMapping("/getSession3")public String getSession3(@SessionAttribute("name") String name) {//String name = (String)session.getAttribute("name");return "获取到session的值了 name:"+name;}

六.总结.

  • Cookie 和Session都是会话机制, Cookie是客⼾端机制, Session是服务端机制. ⼆者通过SessionId来关联.
  • Spring MVC内置HttpServletRequest, HttpServletResponse两个对象. 需要使用时, 直接在方法中添加对应参数即可, Cookie和Session可以从HttpServletRequest中来获取, 也可以直接使用HttpServletResponse设置HTTP响应状态码

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

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

相关文章

IPv6知识点整理

IPv6:是英文“Internet Protocol Version 6”(互联网协议第6版)的缩写,是互联网工程任务组(IETF)设计的用于替代IPv4的下一代IP协议,其地址数量号称可以为全世界的每一粒沙子编上一个地址 。 国…

BigDataCloud 反向地理编码

在当今数字化飞速发展的时代,地理信息的精确获取和游戏数据的深入分析成为众多领域的关键需求。2024 年的今天,技术的创新为我们带来了更为出色的 API 服务。BigDataCloud 反向地理编码服务,能够将经纬度迅速而准确地转换为详细位置信息&…

ThinkPHP5大学生社会实践管理系统

有需要请加文章底部Q哦 可远程调试 ThinkPHP5大学生社会实践管理系统 一 介绍 大学生社会实践管理系统基于ThinkPHP5框架开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈:ThinkPHP5mysqlbootstrapphpstudyvscode 二 功…

ChatTTS增强版V3【已开源】,长文本修复,中英混读,导入音色,批量SRT、TXT

ChatTTS增强版V3来啦!本次更新增加支持导入SRT、导入音色等功能。结合上次大家反馈的问题,修复了长文本、中英混读等问题。 项目已开源(https://github.com/CCmahua/ChatTTS-Enhanced) 项目介绍 V3 ChatTTS增强版V3,长文本修复&#xff0c…

找不到xinput1_3.dll如何修复?总结几种靠谱的修复方法

在数字时代,软件问题几乎是每个电脑用户都会遇到的难题。最近,我也遇到了一个令人头疼的问题——xinput1_3.dll文件丢失。这个问题导致我无法正常运行一些游戏,十分影响我的娱乐体验。通过这次修复经历,我不仅解决了问题&#xff…

8个腾讯,18个阿里,104个百度

8个腾讯、18个阿里巴巴、104个百度!英伟达市值已经超越我的前司微软,成为全球第一,(虽然今天又被微软超越,但势头非常猛)达到了恐怖的3.34万亿美元!这是什么概念?相当于8个腾讯,18个…

ES6+Vue

ES6Vue ES6语法 ​ VUE基于是ES6的,所以在使用Vue之前我们需要先了解一下ES6的语法。 1.什么是ECMAScript6 ECMAScript是浏览器脚本语言的规范,基于javascript来制定的。为什么会出现这个规范呢? 1.1.JS发展史 1995年,网景工…

【第25章】Vue实战篇之用户登出

文章目录 前言一、后端代码二、前端代码1.接口调用2.界面代码3.事件代码 三、效果总结 前言 这里来演示用户登出。 一、后端代码 /*** 登出* param token token* return Result*/RequestMapping("logout")public Result logout(RequestHeader("Authorization&…

LeetCode26. 删除有序数组中的重复项题解

LeetCode26. 删除有序数组中的重复项题解 题目链接: https://leetcode.cn/problems/remove-duplicates-from-sorted-array 题目描述: 给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一…

Excel 如何复制单元格而不换行

1. 打开excle, sheet1右键单击>查看代码>插入>模块 输入代码 Sub CopyText() Updated by NirmalDim xAutoWrapper As ObjectSet xAutoWrapper New DataObject or GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")xAutoWrapper.SetText ActiveC…

Depth Anything V2:抖音开源高性能任何单目图像深度估计V2版本,并开放具有精确注释和多样化场景的多功能评估基准

📜文献卡 题目: Depth Anything V2作者: Lihe Yang; Bingyi Kang; Zilong Huang; Zhen Zhao; Xiaogang Xu; Jiashi Feng; Hengshuang ZhaoDOI: 10.48550/arXiv.2406.09414摘要: This work presents Depth Anything V2. Without pursuing fancy technique…

RN组件库 - Button 组件

从零构建 React Native 组件库,作为一个前端er~谁不想拥有一个自己的组件库呢 1、定义 Button 基本类型 type.ts import type {StyleProp, TextStyle, ViewProps} from react-native; import type {TouchableOpacityProps} from ../TouchableOpacity/type; import…

webpack安装sass

package.json文件 {"devDependencies": {"sass-loader": "^7.2.0","sass": "^1.22.10","fibers": "^4.0.1"} }这个不用webpack.config.js module.exports {module: {rules: [{test: /\.s[ac]ss$/i,u…

FlinkSQL开发经验分享

最近做了几个实时数据开发需求,也不可避免地在使用Flink的过程中遇到了一些问题,比如数据倾斜导致的反压、interval join、开窗导致的水位线失效等问题,通过思考并解决这些问题,加深了我对Flink原理与机制的理解,因此将…

DC-DC 高压降压、非隔离AC-DC、提供强大的动力,选择优质电源芯片-(昱灿)

畅享长续航,尽在我们的充电芯片! 无论是手机、平板还是智能设备,长时间使用后电量不足总是令人头疼。然而,我们的充电芯片将为您带来全新的充电体验!采用先进的技术,我们的充电芯片能够提供快速而稳定的充电…

威纶通触摸屏软件出现显示异常问题(显示黑色)处理方法

异常现象 电脑端显示异常,显示黑色 解决方法 Step1:软件根目录查找DisplaySetting.exe Step2:勾选第1或第2项,重启软件即可 分享创作不易,请多多支持,点赞、收藏、关注! Ending~

《计算机英语》 Unit 3 Software Engineering 软件工程

Section A Software Engineering Methodologies 软件工程方法论 Software development is an engineering process. 软件开发是一个工程过程。 The goal of researchers in software engineering is to find principles that guide the software development process and lea…

冲击2024年CSDN博客之星TOP1:CSDN文章质量分查询在哪里?

文章目录 一,2023年博客之星规则1,不高的入围门槛2,[CSDN博文质量分测评地址](https://www.csdn.net/qc) 二,高分秘籍1,要有目录2,文章长度要足够,我的经验是汉字加代码至少1000字。3&#xff0…

6G时代,即将来临!

日前,由未来移动通信论坛、紫金山实验室主办的2024全球6G技术大会在南京召开。本次大会以“创新预见6G未来”为主题,在大会开幕式上发布了协力推进全球6G统一标准行动的倡议和紫金山科技城加速培育以6G技术引领未来产业行动计划。 在我国已开展第五代移动…

会自动清除的文件——tempfile

原文链接:http://www.juzicode.com/python-tutorial-tempfile/ 在某些不需要持久保存文件的场景下,可以用tempfile模块生成临时文件或者文件夹,这些临时文件或者文件夹在使用完之后就会自动删除。 NamedTemporaryFile用来创建临时文件&…