Cookie(搭配domain)/Session(搭配HttpServletRequest+HttpSession)

各位看官,大家早安午安晚安呀~~~

如果您觉得这篇文章对您有帮助的话

欢迎您一键三连,小编尽全力做到更好
欢迎您分享给更多人哦

今天我们来学习:Cookie/Session

1.Cookie/Session的简述

我们在讲解HTTP协议的时候已经讲解过Cookie了

HTTP 协议自身是属于 "无状态" 协议.

"无状态" 的含义指的是:

默认情况下 HTTP 协议的客户端和服务器之间的这次通信, 和下次通信之间没有直接的联系(不幂等).

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

例如登陆网站成功后, 第⼆次访问的时候服务器就能知道该请求是否是已经登陆过了(不然我每次登录软件,都要输入账户密码真的是太费劲了)

1.1回顾 Cookie

Cookie:浏览器在本地存储数据的一种方式。

现代浏览器设计时,会避免网页直接访问计算机的文件系统,因此,浏览器封装了操作文件的API,浏览器作为中间层,管理所有Cookie的读写操作。网页不能直接访问文件系统。

上述的令牌(SessionID)就通常存放在Cookie中

我们每一次访问服务器的时候就要带上Cookie(不管服务器要不要都会带上)

此时在服务器这边就需要记录"令牌"(SessionID)信息, 以及令牌对应的用户信息, 这个就是 Session 机制所做的工作(就像一个Hash表(里面都是键值对)

1.2.理解Session

Session:Session 是服务器端保存用户信息的⼀种机制.

也可以这么说:Session是服务器为了保存用户信息而创建的⼀个特殊的对象(本质上就是一个哈希表)

我们先来了解一下什么是会话。会话: 对话的意思

服务器同⼀时刻收到的请求是很多的. 服务器需要清楚的区分每个请求是从属于哪个用户, 也就是属于哪个会话, 就需要在服务器这边记录每个会话以及与用户的信息的对应关系.
注意:
Session默认是保存在内存中的,如果重启服务器则 Session 数据就会丢失.

1.3.Cookie和Session的区别

  1. Cookie 是客户端保存用户信息的⼀种机制.
  2. Session 是服务器端保存用户信息的⼀种机制.
  3. Cookie 和 Session之间主要是通过 SessionId 关联起来的, SessionId 是 Cookie 和 Session 之间的桥梁。
  4. Cookie 和 Session 经常会在一起配合使用. 但是不是必须配合。Session 中的sessionId 也不需要非得通过 Cookie/Set-Cookie 传递, 比如通过URL传递.

1.4.domain

在 HTTP Cookie 中,domain 是一个非常重要的属性,它决定了 Cookie 的作用域,即哪些域名可以访问这个 Cookie通过设置 domain,你可以控制 Cookie 在哪些域名下生效。

譬如你给这个Cookie的domian是:127.0.0.1那么这个Cookie就只能在127.0.0.1(自己主机)下生效

直接理解:这个domain就是一个域名(给一个Cookie设置上这个域名(domain),这个Cookie就只能在这个域名下生效))

1.5.Cookie各个字段的解析

  1. ID=20

    • 含义:这是 Cookie 的核心数据,由键值对组成(ID 是名称,20 是值)。
    • 作用:通常用于标识用户会话(如登录状态、用户 ID)或存储自定义数据,具体含义由网站后台逻辑决定。
  2. Path=/

    • 含义:指定 Cookie 的有效路径。/ 表示根路径,即该 Cookie 对网站所有路径(如 /page1/api/data)均有效。
    • 示例:若设置为 Path=/admin,则 Cookie 仅在访问 https://example.com/admin 及子路径时生效。
  3. Expires=Sat, 04 Jul 2026 07:05:02 GMT

    • 含义:Cookie 的过期时间(GMT 格式)。若未设置该字段,Cookie 会在浏览器关闭时过期(会话级 Cookie)。
    • 作用:控制 Cookie 的存储时长,超过时间后浏览器会自动删除。
  4. 其他常见字段(可能未显示但重要)

    • Domain:你设置的 127.0.0.1 即为此字段,下文详细说明。
    • Secure:若存在,说明 Cookie 仅在 HTTPS 连接下有效。
    • HttpOnly:防止 JavaScript 读取 Cookie,提升安全性

domain具体解析:

 Domain 定义
  • 本质指定 Cookie 允许发送的目标域名或 IP 地址。
  • 示例
    • 若设置为 Domain=example.com,Cookie 会在访问 example.com 及其子域名(如 sub.example.com)时发送。
    • 你设置的 127.0.0.1 是本地回环地址,代表仅对当前主机(本地开发环境)有效。
2. Domain 匹配规则(本质就是域名和路径匹配的  (或则子域名)时,才能访问到这个cookie)
  • 严格匹配:Cookie 仅在请求域名与 Domain 完全一致或为其子域名时发送。
    • 例如:Domain=127.0.0.1 不会在请求 localhost 时发送(尽管两者可能指向同一主机,但域名不同)。
  • 安全限制
    • 不能跨域名设置 Cookie(如 example.com 无法为 google.com 设置 Cookie)。
    • 子域名可访问父域名的 Cookie(如 sub.example.com 可读取 Domain=example.com 的 Cookie),但反之不行。
3. 本地开发场景的 Domain 应用
  • 场景:在 Postman 中测试本地服务(如 http://127.0.0.1:8080)时,设置 Domain=127.0.0.1 可确保 Cookie 仅在请求该地址时生效,避免干扰其他服务。
  • 对比:若设置为 Domain=localhost,则 Cookie 会在请求 localhost 时生效,需根据服务实际绑定的域名 / IP 选择。

总之:

Cookie 工作原理总结
  1. 发送机制:当浏览器访问符合 Domain 和 Path 条件的地址(或则子域名)时,自动携带对应 Cookie 到请求头中。
  2. 用途:用于状态保持(如登录)、用户偏好存储、跟踪用户行为等。
  3. 安全提示
    • 生产环境中避免将敏感数据(如密码)存入 Cookie。
    • 合理设置 HttpOnly 和 Secure 字段,防止 XSS 攻击和中间人窃密。

2.如何获得Cookie和Session

2.1获得Cookie的两种方法

先声明:Spring MVC是基于 Servlet API 构建的原始 Web 框架, 也是在Servlet的基础上实现的。

首先介绍两个类:

  • HttpServletRequest :包含了HTTP请求中的所有信息(当然也包括Cookie(还有Cookie中的SessionID))
  • HttpServletResponse:包含了HTTP响应里面的所有信息
    比如向客户端发送的数据, 响应头, 状态码等. 通过这个对象提供的方法, 可以获得服务器响应的所有内容

看似这两个类十分的强大(其实就是很强大哈哈),但是我们使用这两个类的时候还是会频繁地出现一些相似的代码(不是很方便)。于是Spring MVC在这两个对象的基础上进行了封装, 给我们提供更加简单的使用方法(只是封装,但是本质上Spring MVC本质上还是从这两个类里面拿到数据,只是我们省事了)

2.1.1.使用HttpServletRequest获得Cookie的方法

 @RequestMapping("/getCookie")public String getCookie(HttpServletRequest request, HttpServletResponse response) { //这两个参数不用传//因为这两个参数是Spring里面内置的对象,用的话需要声明,不需要就不用声明/* 本质上Spring也是直接从这两个类里拿的参数,就譬如这个拿参数就太传统了String name = request.getParameter("name");*///响应里面有什么response里面就有什么,我们想响应什么我们直接设置就好了//拿到CookieCookie[] cookies = request.getCookies();if (cookies != null) {Arrays.stream(cookies).forEach(ck -> System.out.println(ck.getName() + ";" + ck.getValue()));return "获取Cookie成功";}return "cookie为空";}

结果:可以看到Cookies为空(默认情况下,第一次访问时,浏览器默认不会携带任何 Cookie。 request.getCookies() 返回 null,不会打印任何内容 )

我们可以手动设置Cookie,其实这也是一种作弊的体现其实我们也能修改SessionID,但是服务器没有这个SessionID也是白搭)

如何手动设置Cookie呢?

然后Header就会出现一个Cookie


然后就获取Cookie成功了

2.1.2.利用注解@CookieValue

@RequestMapping("/getCookie2")  //直接通过注解的方式来获取,注解里面的值就是要获取的Cookie值public String getCookie2(@CookieValue("name") String name) {return "获取的Cookie- name" + name;}

结果:

设置Cookie还是很困难的,有兴趣的话大家可以自行学习哦~~

2.2.设置Session的三种方法

传统的获得Cookie的方法需要request.getCookies();(问就是)

这个我还要看,但不是现在

Spring还提供了一个内置类,直接获得Session对象--HttpSession

2.2.1.使用HttpServletRequest获得Session的方法

如何从Cookie中先拿到SessionID,根据SessionID获取Session对象,如果一开始没有Session,就会创建一个Session对象。获取Session里面的属性,前提是要有。但是Session是服务器用来存储用户信息的地方,我们没办法进行伪造,只能进行设置
    @RequestMapping("/getSession1")  //直接通过注解的方式来获取,注解里面的值就是要获取的Cookie值public String getSession1(HttpServletRequest request) {//从Cookie中先拿到SessionID,根据SessionID获取Session对象,如果一开始没有Session,就会创建一个Session对象HttpSession session = request.getSession();//获取Session里面的属性,前提是要有。但是Session是服务器用来存储用户信息的地方,我们没办法进行伪造,只能进行设置String name = (String) session.getAttribute("name"); // 获取name属性// 要进行强转一下,我们获取到的都是Object对象return "从session获得值: "+name;}

结果:

然后我们直接设置一下Session,代码实现:

 @RequestMapping("/setSession1")  //直接通过注解的方式来获取,注解里面的值就是要获取的Cookie值public String setSession1(HttpServletRequest request) {HttpSession session = request.getSession(); // 一样的先拿Session对象session.setAttribute("name","zhangsan");  // 我们这里设置什么都可以毕竟是设置成Object类,当然获取到的也是Object类return "设置session成功";}

然后再获得一下Session:

2.2.2.HttpSession获得Session的方法

@RequestMapping("/setSession2")public String setSession1(HttpSession session) {  // 直接利用session对象session.setAttribute("name","zhangsan");return "设置session成功";}

2.2.3.@SessionAttribute注解的方法获得Session

  @RequestMapping("/getSession3")public String getSession3(@SessionAttribute("name") String name) {return "username:"+name;}

2.3.设置Session的两种方法

2.3.1.HttpselvertResponse设置Session

上面第一种获得Session方法我们已经演示过(设置完SessionID会发生变化

 @RequestMapping("/setSession1")  //直接通过注解的方式来获取,注解里面的值就是要获取的Cookie值public String setSession1(HttpServletRequest request) {HttpSession session = request.getSession(); // 一样的先拿Session对象session.setAttribute("name","zhangsan");  // 我们这里设置什么都可以毕竟是设置成Object类,当然获取到的也是Object类return "设置session成功";}

2.3.2.利用HttpSession设置Session

 @RequestMapping("/setSession2")public String setSession1(HttpSession session) {  // 直接利用session对象session.setAttribute("name","zhangsan");return "设置session成功";}

3.如何获得和设置请求头

3.1传统获取 header

获取Header也是从 HttpServletRequest 中获取
 @RequestMapping("/getHeader1")public String getHeader1(HttpServletRequest request){ //直接使用内置对象来String userAgent = request.getHeader("User-Agent");return   "User-Agent:"+userAgent;}

3.2.注解@RequestHeader

  @RequestMapping("/getHeader2")public String getHeader2(@RequestHeader("User-Agent") String userAgent) {return "userAgent:"+userAgent;}

4.响应

直接打印 Cookie 对象的问题,遍历数组并打印每个 Cookie 对象时:

for (Cookie ck : cookies) {System.out.println(ck); // 输出:jakarta.servlet.http.Cookie@e2b7326c
}

不管是 cookies.toString()还是Arrays.toString(cookies),还是sout(Cookies)都需要Cookie中实现了自己的toString方法,不然就是打印的

类名+哈希值(jakarta.servlet.http.Cookie@e2b7326c)

  • 原因Cookie 类没有重写 toString() 方法,默认调用 Object.toString(),返回 类名@哈希值

  • 解决方案:手动输出 Cookie 的属性(如 getName() 和 getValue())。

最后:
在我们前面的代码例子中,都已经设置了响应数据, Http响应结果可以是数据, 也可以是静态页面。也可以针对响应设置状态码, Header信息等

上述就是Cookie(搭配domain)/Session(搭配HttpServletRequest+HttpSession)的全部内容啦,不知道您对文章中的问题和思想是否都学会理解了呢?

能看到这里相信您一定对小编的文章有了一定的认可。

有什么问题欢迎各位大佬指出
欢迎各位大佬评论区留言修正~~

您的支持就是我最大的动力​​​!!!

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

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

相关文章

240.搜索二维矩阵Ⅱ

纯暴力有点太唐了&#xff0c;不过竟然能过&#xff1b;还有行和列的表示我一直搞反了。。。class Solution {public boolean searchMatrix(int[][] matrix, int target) {for(int i 0 ;i<matrix.length;i){for(int j 0 ;j<matrix[0].length;j){if(matrix[i][j]target)…

【计算机组成原理】-CPU章节学习篇—笔记随笔

计算机组成原理 CPU 章节知识点总结&#xff08;适用于 408 考研&#xff09;​ 一、CPU 的功能与基本结构​ 1.1 CPU 的功能​ CPU&#xff08;中央处理器&#xff09;是计算机的核心部件&#xff0c;主要功能包括&#xff1a;​ 指令控制&#xff1a;程序的顺序执行&#xff…

公用测控装置的功能

公用测控装置在电力系统中广泛应用于变电站的高压开关单元、变压器本体及低压侧等对象。它集测量、控制、保护于一体&#xff0c;确保电网的安全、稳定运行。公用测控装置采用高性能硬件架构&#xff0c;如32位微控制器和独立AD采样技术&#xff0c;结合软件算法&#xff0c;实…

数据库|达梦DM数据库配置实例步骤

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 最近因为一个信创项目&#xff0c;要使用达梦DM数据库&#xff0c; 因此安装了达梦DM数据库来学习使用&#xff0c; 上一节中记录了安装Windows版本达梦DM数据库的过程步骤&#xff0c; 这一节紧接着上一节《数据库…

三十一、【高级特性篇】接口用例参数化与关联:实现上下文数据传递

三十一、【高级特性篇】接口用例参数化与关联:实现上下文数据传递 前言准备工作第一部分:后端数据模型调整1. 升级 `TestCase` 模型2. 生成并应用数据库迁移3. 更新 `TestCaseSerializer`第二部分:后端测试执行器强化1. 修改 `execute_api_test_case` 函数2. 修改 Celery 任…

PCA通过“找最大方差方向”实现降维,本质是用更少的变量捕捉原始数据的主要模式

什么事 PCA(主成分分析) PCA(主成分分析)的原理与通俗举例 PCA 是什么? PCA(Principal Component Analysis)是一种常用的降维算法,核心目标是将高维数据映射到低维空间,同时尽可能保留原始数据的关键信息(方差最大的方向)。 核心原理:找“最能代表数据的方向”…

JAVA synchronized关键字涉及的Monitor对象中 EntryList和WaitSet工作机制

在Java的synchronized同步机制中&#xff0c;Monitor对象的EntryList和WaitSet是两个关键队列&#xff0c;它们分别管理不同状态的线程。下面我将详细解释它们的工作原理&#xff0c;并提供代码示例说明。 EntryList&#xff08;锁竞争队列&#xff09; 作用机制 EntryList保…

js-day10

JS学习之旅-day101. 作用域1.1 局部作用域1.2 全局作用域1.3 作用域链1.4 JS垃圾回收机制&#xff08;GC&#xff09;1.5 闭包1.6 变量提升2. 函数进阶2.1 函数提升2.2 函数参数2.3 箭头函数3. 解构赋值3.1 数组解构3.2 对象解构4. 数组遍历4.1 forEach4.2 filter1. 作用域 作…

智能数字式毫秒计在实际生活场景中的应用

在电力领域&#xff0c;SYN5307型数字毫秒表可精准监测特高压变电站断路器合闸时间差&#xff0c;定位继电保护装置信号延迟&#xff1b;工业自动化中&#xff0c;优化汽车焊装线时序、提升半导体晶圆切割良率&#xff1b;科研计量上&#xff0c;助力量子通信同步校准&#xff…

Java面试基础:概念

1. Java的特点跨平台性&#xff1a;Java的 “编写一次&#xff0c;运行无处不在” 是其最大的特点之一。Java编译器将源代码编译成字节码(bytecode)&#xff0c;该字节码可以在任何安装了Java虚拟机(JVM)的系统上运行。面向对象&#xff1a;Java是一门严格的面向对象编程语言&a…

PyQt5高级窗口控件详解:停靠窗口、多文档界面与滚动条

掌握PyQt5的高级窗口控件&#xff0c;让你的GUI应用具备专业级的布局与交互体验 在PyQt5应用开发中&#xff0c;高效管理窗口布局和实现复杂交互功能是提升用户体验的关键。本文将深入解析三个核心高级控件&#xff1a;停靠窗口&#xff08;QDockWidget&#xff09;、多文档界面…

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | DrawingApp(画板组件)

&#x1f4c5; 我们继续 50 个小项目挑战&#xff01;—— DrawingApp组件 仓库地址&#xff1a;https://github.com/SunACong/50-vue-projects 项目预览地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 Composition API&#xff08;<script setup>…

Eureka、Nacos、LoadBalance、OpenFeign​之间的区别联系和协作 (附代码讲解)

这篇文章聊聊微服务里的这几个老伙计&#xff1a;Eureka、Nacos、LoadBalance、OpenFeign。咱们做微服务开发&#xff0c;总会跟这几个组件打交道&#xff1a;Eureka、Nacos、Spring Cloud LoadBalancer、OpenFeign。它们各司其职又互相配合&#xff0c;今天就把它们的关系、用…

JavaSE-继承

继承&#xff08;inheritance&#xff09;继承的意义我们首先来看下面两个类&#xff1a;public class Dog {public String name;public int age;public void eat(){System.out.println(this.name"正在吃饭");}public void bark(){System.out.println(this.name"…

第二届虚拟现实、图像和信号处理国际学术会议(VRISP 2025)

重要信息 官网&#xff1a;www.icvisp.net 时间&#xff1a;2025年8月1-3日 地点&#xff1a;中国-长沙 简介 近年来&#xff0c;虚拟现实技术取得了显著进步&#xff0c;与5G、云计算和物联网等新一代信息技术的融合加速&#xff0c;推动了其在硬件、软件和内容应用等方面…

SpringBoot+Mybatis+MySQL+Vue+ElementUI前后端分离版:整体布局、架构调整(二)

目录 一、前言 二、后端调整 1.实体类调整 2.菜单相关接口 3.用户相关接口 4.新增工具类 5.新增菜单树返回类 6.配置类、拦截器 三、前端调整 1.请求调整 2.页面布局、样式调整 1.user.vue 2.index.vue 3.请求拦截 四、开发过程中的问题 五、附&#xff1a…

vue3官方文档学习心得

这几天抽空把vue3的文档整个看了一遍。简介 | Vue.js 23年写过一个vue2的项目&#xff0c;24年写了一个vue3的项目&#xff0c;页面功能比较简单&#xff0c;用几个简单的API&#xff0c;watch、watchEffect、ref、reactive就能实现的业务功能。 写了几年的react的&#xff0…

Pycharm恢复默认设置,配置导致复制粘贴等不能使用

在file 种找到manage IDE settings在manage IDE settings中找到restore default settings

【王树森推荐系统】召回12:曝光过滤 Bloom Filter

概述 曝光过滤通常是在召回阶段做&#xff0c;具体的方法就是用 Bloom Filter 曝光过滤问题 如果用户看过某个物品&#xff0c;则不再把该物品曝光给用户。原因是同一个物品重复曝光给用户会损害用户体验&#xff0c;但也不是所有推荐系统都有曝光过滤&#xff0c;像 youtube 这…

基于STM32单片机的心率血氧监测系统设计(STM32代码编写+手机APP设计+PCB设计+Proteus仿真)

系列文章目录 文章目录 系列文章目录前言1 资料获取与演示视频1.1 资料介绍1.2 资料获取1.3 演示视频 2 系统框架3 硬件3.1 主控制器3.2 显示屏3.3 WIFI模块3.4心率血氧传感器 4 设计PCB4.1 安装下载立创EDA专业版4.2 画原理图4.4 使用嘉立创下单助手进行下单&#xff0c;打板。…