一文掌握Spring Cookie和Session 是什么及区别介绍

 更新时间:2025年01月09日 10:13:12   作者:椰椰椰耶  
Cookie和Session都是用于在客户端和服务器之间传递信息的技术,但它们的工作方式和使用场景有所不同,Cookie是在客户端保存用户信息的一种机制,而Session是在服务器端保存用户信息的一种机制,本文介绍Spring Cookie和Session 是什么,感兴趣的朋友一起看看吧

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

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

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

  • 例如登录网站成功后,第二次访问的时候服务器就能知道该请求是否是已经登录过了

image.png

上述图片中的“令牌”通常就存储在 Cookie 字段中

比如去医院挂号:

  • 看病之前先挂号,挂号时需要提供身份证号,同时得到一张“就诊卡”,这个就诊卡就相当于患者的“令牌”
  • 后续去各个科室进行检查、诊断、开药等操作,都不必再出示身份证了,只要凭“就诊卡”就可以识别出当前患者的身份
  • 看完病之后,不想要就诊卡了,就可以注销这个卡。此时患者的身份和就诊卡的关联关系就被销毁了(类似于网站的注销功能)
  • 又来看病,可以办一张新的就诊卡,此时就得到了一个新的“令牌”

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

理解 Session

会话就是对话的意思

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

比如我们打客服电话

  • 每次打客服电话,都是一个会话,挂断电话,会话就结束了
  • 下次再打客服电话,就又是一个新的会话
  • 如果我们长时间不说话,没有新的请求,会话也会结束

服务器同一时刻收到的请求时很多的。服务器需要清楚地区分每个请求时从属于哪个用户,也就是属于哪个会话,就需要在服务器这边记录每个会话以及与用户的信息的对应关系

Session 是服务器为了保存用户信息而创建的一个特殊的对象

image.png|589

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

image.png|570

image.png

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

tokenSessionId 是相似的,但是不一样。token 是身份的证明,SessionId 是其中一种实现方式

image.png

  • 当用户登录的时候,服务器Session 中新增一个新纪录,并把 SessionId 返回给客户端(通过 HTTP 响应中的 Set-Cookie 字段返回)
  • 客户端后续再给服务器发送请求的时候,需要在请求中带上 SessionId(通过 HTTP 请求中的 Cookie 字段带上)
  • 服务器收到请求之后,根据请求中的 SessionIdSession 信息中获取到对应的用户信息,再进行后续操作。若找不到,则重新创建 Session,并把 SessionId 返回

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

Cookie 和 Session 的区别

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

到此这篇关于一文掌握Spring Cookie和Session 是什么的文章就介绍到这了,更多相关Spring Cookie和Session内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • maven父子工程中的依赖引用的实现

    maven父子工程中的依赖引用的实现

    本文主要介绍了Maven父子工程中的依赖引用的实现,包括<dependencyManagement>和<dependencies>两个标签的使用,以及父子pom文件的配置,感兴趣的可以了解一下
    2024-10-10
  • 解析java中volatile关键字

    解析java中volatile关键字

    这篇文章主要为大家解析了java中volatile关键字,经常有人把volatile关键字和synchronized或者lock混淆,本文就为大家好好区分,感兴趣的小伙伴们可以参考一下
    2016-01-01
  • SpringBoot整合Mybatis实现多数据源配置与跨数据源事务实例

    SpringBoot整合Mybatis实现多数据源配置与跨数据源事务实例

    开发中经常有这样的需要: 读写分离。微服务环境下可以实现一个服务读取一个数据库,另一个服务写库。但是在实际应用中有时也需要在一个服务中读写不同的数据库。可以在一个SpringBoot单体项目中配置多个数据源解决读写库分离
    2022-11-11
  • SpringBoot--- SpringSecurity进行注销权限控制的配置方法

    SpringBoot--- SpringSecurity进行注销权限控制的配置方法

    这篇文章主要介绍了SpringBoot--- SpringSecurity进行注销,权限控制,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • SpringBoot 开发提速神器 Lombok+MybatisPlus+SwaggerUI

    SpringBoot 开发提速神器 Lombok+MybatisPlus+SwaggerUI

    这篇文章主要介绍了SpringBoot 开发提速神器 Lombok+MybatisPlus+SwaggerUI,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 永久解决idea git log乱码的问题

    永久解决idea git log乱码的问题

    这篇文章主要介绍了永久解决idea git log乱码的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • spring boot+spring cache实现两级缓存(redis+caffeine)

    spring boot+spring cache实现两级缓存(redis+caffeine)

    这篇文章主要介绍了spring boot+spring cache实现两级缓存(redis+caffeine),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • MyBatis 多个条件使用Map传递参数进行批量删除方式

    MyBatis 多个条件使用Map传递参数进行批量删除方式

    这篇文章主要介绍了MyBatis 多个条件使用Map传递参数进行批量删除方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 学习Java中的List集合

    学习Java中的List集合

    这篇文章主要介绍了学习Java中的List集合,List是一个有序集合, 说是集合,其实只是只是Collection接口的一个子接口,下面关于List的相关资料 需要的小伙伴可以参考一下,希望对你有所帮助
    2022-02-02
  • 创建SpringBoot多模块项目实现方式

    创建SpringBoot多模块项目实现方式

    这篇文章主要介绍了创建SpringBoot多模块项目实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2026-03-03

最新评论