当前位置: 首页 > news >正文

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.dtcms.com/a/267339.html

相关文章:

  • python优先队列使用
  • 基于spark的奥运会奖牌变化数据分析
  • mysql的备份与恢复(使用mysqldump)
  • MyChrome.exe与Selenium联动避坑指南:User Data目录冲突解决方案
  • 爬虫-web请求全过程
  • 数据结构:数组:二分查找(Binary Search)
  • C#使用开源框架NetronLight绘制流程图
  • Hinge×亚矩云手机:以“深度连接”为名,重构云端社交的“真实感”
  • AI 正在深度重构软件开发的底层逻辑和全生命周期,从技术演进、流程重构和未来趋势三个维度进行系统性分析
  • Jedis 原生之道:Redis 命令 Java 实现指南(二)
  • SpringAI与智能体入门
  • 探索 Ubuntu 上 MongoDB 的安装过程
  • NX二次开发常用函数——获取边对应的面 UF_MODL_ask_edge_faces
  • 使用 C++/Faiss 加速海量 MFCC 特征的相似性搜索
  • 电脑休眠设置
  • 【网络与爬虫 13】智能伪装:Scrapy-Fake-UserAgent反检测技术实战指南
  • springboot中使用线程池
  • 【Elasticsearch】检索排序 分页
  • 20. 有效的括号
  • BUUCTF在线评测-练习场-WebCTF习题[网鼎杯 2020 青龙组]AreUSerialz1-flag获取、解析
  • 【Flask】flask中get方法和post方法区别
  • CMake基础:条件判断详解
  • openai和chatgpt什么关系
  • 单用户模式、紧急模式、救援模式有什么区别
  • 动手学深度学习-学习笔记【二】(基础知识)
  • 若 VSCode 添加到文件夹内右键菜单中显示(通过reg文件方式)
  • 在 Windows 上安装和运行 Apache Kafka
  • Android Input 系列专题【事件的读取与分发】
  • 在SSM+vue项目中上传表单数据和文件
  • android开发中的 AndroidX 版本的查看 及 constraintLayout的简单用法