破解HTTP无状态:基于Java的Session与Cookie协同工作指南

news2025/6/9 17:34:43

        HTTP协议自身是属于“无状态”协议

        无状态是指:默认情况下,HTTP协议的客户端和服务器之间的这次通信,和下次通信之间没有直接的关系

        但在实际开发中,我们很多时候是需要知道请求之间的关联关系的

        上述图中的令牌,通常就存储在Cookie字段中,此时在服务器这边就要记录“令牌”信息,以及令牌对应的用户信息,这就是Session机制所做的工作

一、理解Session和Cookie

        先来了解一下什么是会话

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

        在服务器并发处理海量请求时(如电商大促秒杀场景),​Session(会话对象)是服务端创建的特殊数据结构​,用于识别每个请求所属的用户身份和存储并维护会话与用户数据的映射关系(如购物车数据、登录状态)。

        Session的本质就是一个"哈希表",存储了一些键值对结构,Key就是SessionID,Value就是用户信息(用户信息可以根据需求灵活设计) 

        SessionId 在服务器这边是唯一的,前面提到的“令牌”就可以看作为 SessionId,只不过它还会携带一些其他的信息,比如时间,签名等

        (1)用户登录的时候,服务器会在Session中新增一个记录,通过HTTP响应中的Set-Cookie字段返回给客户端

        (2)客户端后续再次给该服务器发送请求时,会在HTTP请求中的Cookie字段中携带SessionId

        (3)服务器收到请求之后,根据SessionIdSession中查找并获取对应的用户信息,再进行后续操作,若找不到就会重新新增一个记录,返回SessionId(回到起初阶段) 

        Cookie ​​默认存储在用户的浏览器中,Session 由​​服务器管理​​(内存/数据库)

CookieSession区别

        Cookie是客户端保存用户信息的一种机制;Session是服务器保存用户信息的一种机制

        CookieSession之间主要是通过SessionId关联起来的

二、Cookie

2.1、定义

  • 客户端(浏览器)存储的小型文本数据(键值对形式),用于记录用户状态或标识

2.2、获取Cookie

@RestController
@RequestMapping("/Session")
public class GetSessionController {
    @RequestMapping("/A1")
    public String A1(HttpServletRequest request, HttpServletResponse response){
        Cookie[] cookies=request.getCookies();
        StringBuilder stringBuilder=new StringBuilder();
        if(cookies!=null){
            for(Cookie ck:cookies){
                stringBuilder.append(ck.getName()+"="+ck.getValue());
            }
        }
        return stringBuilder.toString();
    }
}

        HttpServletRequestHttpServletResponseServlet提供的两个类,是Spring MVC方法的内置对象

        HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中所有的信息都封转在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息

        HttpServletResponse对象代表服务器的响应,HTTP响应的信息都在这个对象中,通过该对象的方法,可以获得服务器响应的所有内容

         访问后得到了设置的Cookie

2.3、使用注解获取Cookie 

 @RequestMapping("/A2")
    public String A2(@CookieValue("name") String name){
        return  "name为:"+name;
    }

三、Session

3.1、定义​

  • 服务器创建的会话状态存储结构,本质是 ​​内存/数据库中的键值表​

3.2、存储Session

         Session是服务器端的机制,我们需要先存储,才能获取,Session是基于HttpServletRequest来存储和获取的

  @RequestMapping("/A3")
    public String A3(HttpServletRequest request){
        HttpSession session=request.getSession();
        if (session!=null){
            session.setAttribute("userName","Aokey");
        }
        return "Session设置成功";
    }

        运行后可以看到,HTTP响应后通过Set-Cookie告知客户端,把SessionID 存储在Cookies中

3.3、获取Session

        (1)HttpSession.getSession(boolean create);参数如果为true,那么当不存在会话时新建会话;如果为false,不存在会话时返回null

        (2)HttpSession.getSession();参数默认为true

  @RequestMapping("/A4")
    public String A4(HttpServletRequest request){
        HttpSession session=request.getSession(false);
        if(session==null){
            return "用户未登录";
        }else {
            String useName=(String) session.getAttribute("userName");
            Integer age=(Integer) session.getAttribute("age");
            return "姓名:"+ useName+" 年龄:"+age;
        }
    }

        先后访问:http://127.0.0.1:8080/Session/A3 和  http://127.0.0.1:8080/Session/A4

        Fiddler抓包后发现: 

 3.4、通过注解获取Session

 @RequestMapping("/A5")
    public String A5(@SessionAttribute("userName" ) String userName,@SessionAttribute("age") Integer age){
        return "姓名:"+ userName +" 年龄:"+age;
    }

        通过Spring MVC内置对象HttpSession来获取

 @RequestMapping("/A6")
    public String A6(HttpSession session){
        String userName=(String) session.getAttribute("userName");
        Integer age=(Integer) session.getAttribute("age");
        return "姓名:"+ userName +" 年龄:"+age;
    }

四、Header

4.1、获取Header

        获取Header也是通过HttpServletRequest对象获取

  @RequestMapping("/A7")
    public String A7(HttpServletRequest request){
        String string=request.getHeader("Cookie");
        return "获取到Cookie为:"+string;
    }

        运行结果:http://127.0.0.1:8080/Session/A7

         4.2、使用注解获取Header

 @RequestMapping("/A8")
    public String A8(@RequestHeader("Cookie")  String string){
        return "获取到Cookie为:"+string;
    }

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

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

相关文章

JS 事件流机制详解:冒泡、捕获与完整事件流

JS 事件流机制详解:冒泡、捕获与完整事件流 文章目录 JS 事件流机制详解:冒泡、捕获与完整事件流一、DOM 事件流基本概念二、事件捕获 (Event Capturing)特点代码示例 三、事件冒泡 (Event Bubbling)特点代码示例 四、完整事件流示例HTML 结构JavaScript…

算法专题七:分治

快排 1.颜色分类 题目链接:75. 颜色分类 - 力扣(LeetCode) class Solution {public void swap(int[] nums, int i, int j){int t = nums[i];nums[i] = nums[j];nums[j] = t;}public void sortColors(int[] nums) {int left=-1 ,i=0 ,right=nums.length;while(i<right){i…

Vue中虚拟DOM的原理与作用

绪论 首先我们先了解&#xff0c;DOM&#xff08;Document Object Model&#xff0c;文档对象模型&#xff09; 是浏览器对 HTML/XML 文档的结构化表示&#xff0c;它将文档解析为一个由节点&#xff08;Node&#xff09;和对象组成的树形结构&#xff08;称为 DOM 树&#xf…

使用vue3+ts+input封装上传组件,上传文件显示文件图标

效果图&#xff1a; 代码 <template><div class"custom-file-upload"><div class"upload"><!-- 显示已选择的文件 --><div class"file-list"><div v-for"(item, index) in state.filsList" :key&q…

【Linux】Ubuntu 创建应用图标的方式汇总,deb/appimage/通用方法

Ubuntu 创建应用图标的方式汇总&#xff0c;deb/appimage/通用方法 对于标准的 Ubuntu&#xff08;使用 GNOME 桌面&#xff09;&#xff0c;desktop 后缀的桌面图标文件主要保存在以下三个路径&#xff1a; 当前用户的桌面目录&#xff08;这是最常见的位置&#xff09;。所…

LangGraph--Agent工作流

Agent的工作流 下面展示了如何创建一个“计划并执行”风格的代理。 这在很大程度上借鉴了 计划和解决 论文以及Baby-AGI项目。 核心思想是先制定一个多步骤计划&#xff0c;然后逐项执行。完成一项特定任务后&#xff0c;您可以重新审视计划并根据需要进行修改。 般的计算图如…

Spring Boot 常用注解面试题深度解析

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot 常用注解面试题深度解析一、核心…

Linux系统的CentOS7发行版安装MySQL80

文章目录 前言Linux命令行内的”应用商店”安装CentOS的安装软件的yum命令安装MySQL1. 配置yum仓库2. 使用yum安装MySQL3. 安装完成后&#xff0c;启动MySQL并配置开机自启动4. 检查MySQL的运行状态 MySQL的配置1. 获取MySQL的初始密码2. 登录MySQL数据库系统3. 修改root密码4.…

408第一季 - 数据结构 - 栈与队列

栈 闲聊 栈是一个线性表 栈的特点是后进先出 然后是一个公式 比如123要入栈&#xff0c;一共有5种排列组合的出栈 栈的数组实现 这里有两种情况&#xff0c;&#xff0c;一个是有下标为-1的&#xff0c;一个没有 代码不用看&#xff0c;真题不会考 栈的链式存储结构 L ->…

【RTP】Intra-Refresh模式下的 H.264 输出,RTP打包的方式和普通 H.264 流并没有本质区别

对于 Intra-Refresh 模式下的 H.264 输出,RTP 打包 的方式和普通 H.264 流并没有本质区别:你依然是在对一帧一帧的 NAL 单元进行 RTP 分包,只不过这些 NAL 单元内部有部分宏块是 “帧内编码” 而已。下面分步骤说明: 1. 原理回顾:RFC 6184 H.264 over RTP 按照 RFC 6184 …

Redis实战-消息队列篇

前言&#xff1a; 讲讲做消息队列遇到的问题。 今日所学&#xff1a; 异步优化消息队列基于stream实现异步下单 1. 异步优化 1.1 需求分析 1.1.1 现有下单流程&#xff1a; 1.查询优惠劵 2.判断是否是秒杀时间&#xff0c;库存是否充足 3.实现一人一单 在这个功能中&…

(三)Linux性能优化-CPU-CPU 使用率

CPU使用率 user&#xff08;通常缩写为 us&#xff09;&#xff0c;代表用户态 CPU 时间。注意&#xff0c;它不包括下面的 nice 时间&#xff0c;但包括了 guest 时间。nice&#xff08;通常缩写为 ni&#xff09;&#xff0c;代表低优先级用户态 CPU 时间&#xff0c;也就是进…

佰力博科技与您探讨材料介电性能测试的影响因素

1、频率依赖性 材料的介电性能通常具有显著的频率依赖性。在低频下&#xff0c;偶极子的取向极化占主导&#xff0c;介电常数较高&#xff1b;而在高频下&#xff0c;偶极子的取向极化滞后&#xff0c;导致介电常数下降&#xff0c;同时介电损耗增加。例如&#xff0c;VHB4910…

K8S认证|CKS题库+答案| 4. RBAC - RoleBinding

目录 4. RBAC - RoleBinding 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、查看SA和role 3&#xff09;、编辑 role-1 权限 4&#xff09;、检查role 5&#xff09;、创建 role和 rolebinding 6&#xff0…

React 新项目

使用git bash 创建一个新项目 建议一开始就创建TS项目 原因在Webpack中改配置麻烦 编译方法:ts compiler 另一种 bable 最好都配置 $ create-react-app cloundmusic --template typescript 早期react项目 yarn 居多 目前npm包管理居多 目前pnpm不通用 icon 在public文件夹中…

AI编程在BOSS项目的实践经验分享

前言 在人工智能技术革新浪潮的推动下&#xff0c;智能编程助手正以前所未有的速度重塑开发领域。这些基于AI的代码辅助工具通过智能提示生成、实时错误检测和自动化重构等功能&#xff0c;显著提升了软件工程的全流程效率。无论是初入行业的开发者还是资深程序员&#xff0c;…

数学:”度量空间”了解一下?

度量空间是现代数学中一种基本且重要的抽象空间。以下是对它的详细介绍&#xff1a; 定义 相关概念 常见的度量空间举例 度量空间的类型 度量空间的作用 度量空间是拓扑空间的一种特殊情况&#xff0c;它为拓扑空间的研究提供了具体的模型和实例。同时&#xff0c;度量空间在…

jenkins脚本查看及备份

位置与备份 要完整备份 Jenkins 的所有脚本和相关配置&#xff0c;包括 Jenkinsfile、构建脚本&#xff08;如 .sh / .bat&#xff09;、Job 配置、插件、凭据等&#xff0c;你可以从两个层面入手&#xff1a; ✅ 一、完整备份 Jenkins 主目录&#xff08;最全面&#xff09; …

用电脑通过网口控制keysight示波器

KEYSIGHT示波器HD304MSO性能 亮点: 体验 200 MHz 至 1 GHz 的带宽和 4 个模拟通道。与 12 位 ADC 相比,使用 14 位模数转换器 (ADC) 将垂直分辨率提高四倍。使用 10.1 英寸电容式触摸屏轻松查看和分析您的信号。捕获 50 μVRMS 本底噪声的较小信号。使用独有区域触摸在几秒…

《如何使用MinGW-w64编译OpenCV和opencv_contrib》

《如何使用MinGW-w64编译OpenCV和opencv_contrib》 在Windows环境下使用MinGW编译OpenCV和opencv_contrib是一个常见需求,尤其是对于那些希望使用GCC工具链而非Visual Studio的开发者。下面我将详细介绍这个过程。 准备工作 首先需要安装和准备以下工具和库: MinGW(建议使…