【JavaEE】Cookie和Session详解

news2025/1/11 0:55:19

一.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.coloradmin.cn/o/1849681.html

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

相关文章

【C语言】解决C语言报错:Array Index Out of Bounds

文章目录 简介什么是Array Index Out of BoundsArray Index Out of Bounds的常见原因如何检测和调试Array Index Out of Bounds解决Array Index Out of Bounds的最佳实践详细实例解析示例1:访问负索引示例2:访问超出上限的索引示例3:循环边界…

C# 实现draw一个简单的温度计

运行结果 概述: 代码分析 该控件主要包含以下几个部分: 属性定义: MinValue:最低温度值。 MaxValue:最高温度值。 CurrentValue:当前温度值。 构造函数: 设置了一些控件样式来提升绘制效果…

使用Spring Boot构建RESTful API:从理论到实践

文章目录 引言第一章 RESTful API基础知识1.1 什么是RESTful API1.2 RESTful API的优势 第二章 Spring Boot基础知识2.1 什么是Spring Boot2.2 Spring Boot的主要特性 第三章 使用Spring Boot构建RESTful API3.1 项目初始化3.2 构建基础结构3.3 定义实体类3.4 创建Repository接…

Android低版本上APP首次启动时间减少80%(二)

06-25 15:10:53.821 7449 7450 D dalvikvm: threadid2: sending two SIGSTKFLTs to threadid135 (tid8021) to cause debuggerd dump SIGSTKFLT 是 Dalvik 虚拟机特有的一个信号。当虚拟机发生了 ANR 或者需要做 GC 的时候,就需要挂起所有 RUNNING 状态的线程&…

FPGA国内”薪“赛道-在医疗领域的应用

mian 免 ze 责 sheng 声 ming 明 以下观点仅代表个人观点,不代表任何公司或者行业 从下游应用市场来看,通信和工业市场份额位居FPGA芯片一二位,同时通信市场份额有望持续提升。但是目前通信和工业市场趋于稳定,FPGA厂商一直推AI市…

Docker部署Nginx1.21.5(保姆级图文教程)

系列文章目录 Docker部署Nginx1.21.5(保姆级图文教程) Docker部署MySQL8.3.0(保姆级图文教程) 文章目录 一、环境二、拉取镜像2.1 查找 Docker Hub 上的 nginx 镜像2.2 拉取Nginx镜像2.3 查看Nginx镜像 三、在宿主机创建目录四、启…

深度分析:地缘风险对出口的影响

核心观点 5月以来,CCFI运价涨幅显著扩大。除外需回暖外,集运“涨价”还有哪些催化因素,或如何影响后续出口? 一问:装箱航线运价大幅上涨背后?5月以来运价明显上涨,与外需复苏、出口改善相互印证…

架构设计 - 网站性能优化之静态资源CDN配置

摘要: web 应用业务缓存通常3级: 一级缓存:JVM 本地缓存 二级缓存:Redis集中式缓存 三级缓存:Nginx Proxy Cache 缓存 或 Nginx Lua 缓存 四级缓存:静态资源CDN缓存 页面静态化 本文主要分享 怎样通过CDN缓存静态资源的方式 提高系统性能和响应速度。 WEB应用通过CD…

数字化那点事:一文读懂工业互联网

工业互联网是一个综合了先进计算、分析、感应技术以及互联网连接的全球工业系统,旨在通过智能机器间的连接实现人机互联,进而利用软件和大数据分析重构全球工业,激发生产力,使世界更美好、更快速、更安全、更清洁且更经济。 一、定…

iTextSharp 绘制pdf

一、新建项目&#xff1a;pdfdemo <ItemGroup><PackageReference Include"iTextSharp.LGPLv2.Core" Version"3.4.20" /> </ItemGroup>二、HomeController.cs using iTextSharp.text; using iTextSharp.text.pdf; using Microsoft.AspN…

警惕!最新17本期刊(含2本Top)被“镇压”,无影响因子无分区,这是被踢了吗?

本周投稿推荐 SSCI • 中科院2区&#xff0c;6.0-7.0&#xff08;录用友好&#xff09; EI • 各领域沾边均可&#xff08;2天录用&#xff09; CNKI • 7天录用-检索&#xff08;急录友好&#xff09; SCI&EI • 4区生物医学类&#xff0c;0.5-1.0&#xff08;录用…

Excel 导入实例

在上一节的基础上&#xff0c;本文演示下如何导入excel数据。 Excel导入操作指导 继承ocean-easyexcel SDK&#xff0c;上一节打包生成 <dependency><groupId>com.angel.ocean</groupId><artifactId>ocean-easyexcel</artifactId><version…

Python爬虫基础以及示例讲解

爬虫简介 网络爬虫 爬虫指在使用程序模拟浏览器向服务端发出网络请求&#xff0c;以便获取服务端返回的内容。 但这些内容可能涉及到一些机密信息&#xff0c;所以爬虫领域目前来讲是属于灰色领域&#xff0c;切勿违法犯罪。 爬虫本身作为一门技术没有任何问题&#xff0c;关…

品牌价值超1592亿,九牧是如何炼成“六边形战士”?

作者 | 吉羽 来源 | 洞见新研社 经历了多年高速发展的中国市场开始慢慢减速&#xff0c;消费者正变得越来越“挑剔”&#xff0c;在信息爆炸的今天&#xff0c;企业面临“需求”与“流量”的双重考验。 市场凭什么记住你&#xff1f;选择你&#xff1f; 答案只有一个&#x…

多模态MLLM都是怎么实现的(10)-Chameleon和Florence-2如果你想玩多模态就不能不了解

这个也是一个补充文&#xff0c;前9章基本把该讲的讲了&#xff0c;今天这个内容主要是因为Meta出了一个Chameleon&#xff0c;这个以后可能会成为LLaMA的一个很好的补充&#xff0c;或者说都有可能统一起来&#xff0c;叫LLaMA或者Chamleon或者什么别的&#xff0c;另外我司把…

Hive笔记-5

240619-Hive笔记-5 6.2.2 全表和特定列查询 1) 全表查询 hive (default)> select * from emp; select 查看你要查看的信息 from 你要从哪张表里面查 2) 选择特定列查询 hive (default)> select empno, ename from emp; 注意&#xff1a; &#xff08;1&#xff0…

Oracle基本语法(SQLPlus)

目录&#xff1a; 前言&#xff1a; 准备工作&#xff1a; 登录&#xff1a; 1.打开SQL Plus命令行工具 第一种方式&#xff1a; 第二种方式&#xff1a; 2.以不同用户登录 SYSTEM&#xff08;普通管理员&#xff09;&#xff1a; SYS(超级管理员)&#xff1a; 不显示…

搜索引擎推广基本概念与方法分享-华媒舍

销量是每个企业及个人在商业领域中追求的目标之一。而引擎霸屏推广就是一种高效的手段&#xff0c;通过该方法可以助你实现销量的狂揽。本文将为你科普引擎霸屏推广的基本概念与方法&#xff0c;帮助你了解如何运用这一有效的推广策略。 一、引擎霸屏推广 引擎霸屏推广指的是在…

什么是电商大数据?主流电商大数据的采集||关键性技术|电商API接口接入说明

大数据的时代早已到来&#xff0c;然而想要全方位掌握大数据&#xff0c;务必要掌握大数据造成的时代特征&#xff0c;之前大数据被视为废物&#xff0c;如今被视为财产。主流电商大数据的采集&#xff0c;电商API接口的接入在大多数人理解中&#xff0c;是企业用数据来优化自己…

Electron快速入门(二):在(一)的基础上修改两个文件完成自定义显示时间和天气的标题栏

修改主进程:main.js // main.jsconst { app, BrowserWindow } = require("electron"); const path = require("node:path"); const createWindow = () => {try {const mainWindow = new BrowserWindow({width: 1200,height: 870,alwaysOnTop: true,fr…