【JavaEE进阶】 获取Cookie和Session

文章目录

  • 🍀Cookie简介
  • 🎄理解Session
  • 🌳Cookie 和 Session 的区别
  • 🌲获取Cookie
    • 🚩传统获取Cookie
    • 🚩简洁获取Cookie
  • 🌴获取Session
    • 🚩Session存储
    • 🚩Session读取
      • 🎈传统读取Session
      • 🎈简洁获取Session
    • 🚩结果展示
  • ⭕总结

🍀Cookie简介

HTTP 协议⾃⾝是属于 "⽆状态"协议.

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

  • 默认情况下 HTTP 协议的客⼾端和服务器之间的这次通信,和下次通信之间没有直接的联系.但是实际开发中,我们很多时候是需要知道请求之间的关联关系的.

例如登陆⽹站成功后,第⼆次访问的时候服务器就能知道该请求是否是已经登陆过了.

在这里插入图片描述

想要了解详情的可以看博主写的 【JavaEE初阶】 HTTP 请求 (Request)详解

上述图中的"令牌"通常就存储在Cookie字段中. ⽐如去医院挂号

  1. 看病之前先挂号.挂号时候需要提供⾝份证号,同时得到了⼀张"就诊卡",这个就诊卡就相当于患 者的"令牌".
  2. 后续去各个科室进⾏检查,诊断,开药等操作,都不必再出⽰⾝份证了,只要凭就诊卡即可识别出当 前患者的⾝份.
  3. 看完病了之后,不想要就诊卡了,就可以注销这个卡.此时患者的⾝份和就诊卡的关联就销毁了.(类 似于⽹站的注销操作)
  4. ⼜来看病,可以办⼀张新的就诊卡,此时就得到了⼀个新的"令牌"

此时在服务器这边就需要记录"令牌"信息,以及令牌对应的⽤⼾信息,这个就是 Session 机制所做的⼯作

🎄理解Session

要理解Session,我们先来理解一下会话

在这里插入图片描述

在计算机领域,会话是⼀个客⼾与服务器之间的不中断的请求响应.对客⼾的每个请求,服务器能够识别出请求来⾃于同⼀个客⼾.

当⼀个未知的客⼾向Web应⽤程序发送第⼀个请求时就开始了⼀个会话.当客⼾明确结束会话或服务器在⼀个时限内没有接受到客⼾的任何请求时,会话就结束了.

⽐如我们打客服电话
每次打客服电话,是⼀个会话.挂断电话,会话就结束了
下次再打客服电话,⼜是⼀个新的会话.
如果我们⻓时间不说话,没有新的请求,会话也会结束

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

Session是服务器为了保存⽤⼾信息⽽创建的⼀个特殊的对象

在这里插入图片描述

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

在这里插入图片描述
SessionId 是由服务器⽣成的⼀个 “唯⼀性字符串”,从Session机制的⻆度来看,这个唯⼀性字符串称为 SessionId .

但是站在整个登录流程中看待,也可以把这个唯⼀性字符串称为 token.

上述例⼦中的令牌ID,就可以看做是SessionId,只不过令牌除了ID之外,还会带⼀些其他信息,⽐如时间,签名等.

在这里插入图片描述

  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("/test12")public String test12(HttpServletRequest request, HttpServletResponse response) {// 获取所有 cookie 信息Cookie[] cookies = request.getCookies();//打印Cookie信息StringBuilder builder = new StringBuilder();if (cookies!=null){for (Cookie ck:cookies) {builder.append(ck.getName()+":"+ck.getValue());}}return "Cookie信息:"+builder;}
  • Spring MVC是基于 Servlet API 构建的原始 Web 框架, 也是在Servlet的基础上实现的

  • HttpServletRequest , HttpServletResponse 是Servlet提供的两个类,是Spring MVC⽅法的内置对象.需要时直接在⽅法中添加声明即可.

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

  • HttpServletResponse 对象代表服务器的响应. HTTP响应的信息都在这个对象中, ⽐如向客⼾端发送的数据, 响应头,状态码等. 通过这个对象提供的⽅法, 可以获得服务器响应的所有内容

  • Spring MVC在这两个对象的基础上进⾏了封装, 给我们提供更加简单的使⽤⽅法.

在这里插入图片描述

我们来设置一下Cookie的值(按F12进行设置)

在这里插入图片描述

我们再进行访问时

在这里插入图片描述

🚩简洁获取Cookie

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

在这里插入图片描述
注意:

  • 这个虽然获取更简单,但是一次只能获取你想要获取的参数,不能获取全部参数

🌴获取Session

Session是服务器端的机制,我们需要先存储,才能再获取

Session 也是基于HttpServletRequest来存储和获取的

🚩Session存储

    @RequestMapping("/test14")public String test14(HttpServletRequest request) {// 获取Session对象HttpSession session = request.getSession();if (session != null) {session.setAttribute("username", "java");}return "session 存储成功";}

这个代码中看不到 SessionId 这样的概念的. getSession 操作内部提取到请求中的Cookie⾥的 SessionId, 然后根据SessionId获取到对应的Session 对象, Session 对象⽤HttpSession来描述

在这里插入图片描述

获取Session有以下两种⽅式:

HttpSession getSession(boolean create);HttpSession getSession();

HttpSession getSession(boolean create)

  • 参数如果为 true, 则当不存在会话时新建会话;

  • 参数如果为 false, 则当不存在会话时返回 null

HttpSession getSession(): 和getSession(true) 含义⼀样, 默认值为true.

void setAttribute(String name, Object value): 使⽤指定的名称绑定⼀个对象到该 session 会话

🚩Session读取

🎈传统读取Session

读取 Session 可以使⽤传统的 HttpServletRequest

    @RequestMapping("/test15")public String test15(HttpServletRequest request) {// 如果 session 不存在, 不会⾃动创建HttpSession session = request.getSession(false);String username = null;if (session != null && session.getAttribute("username") != null) {username = (String) session.getAttribute("username");}return "username:" + username;}

🎈简洁获取Session

    @RequestMapping("/test16")public String test16(@SessionAttribute(value = "username",required = false) String username){return "username:"+username;}

🚩结果展示

  • 存储
    在这里插入图片描述
  • 传统获取
    在这里插入图片描述
  • 简洁获取
    在这里插入图片描述

⭕总结

关于《【JavaEE进阶】 获取Cookie和Session》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!

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

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

相关文章

MySQL线上慢SQL问题分析处理小记

相同数据量表结构,线上执行12s 本地执行0.1s过程分析 1. 慢SQL信息 SELECT t1.id,t2.idFROM t_platform_target_standard_target_index t1LEFT JOIN t_platform_target_standard t2 ON t1.target_number t2.target_numberWHERE t1.delete_flag 0 AND t2.user_num …

socket实现视频通话-WebRTC

最近喜欢研究视频流,所以思考了双向通信socket,接下来我们就一起来看看本地如何实现双向视频通讯的功能吧~ 客户端获取视频流 首先思考如何获取视频流呢? 其实跟录音的功能差不多,都是查询电脑上是否有媒体设备,如果…

工业相机如何实现实时和本地Raw格式图像和Bitmap格式图像的保存和相互转换(C#代码,UI界面版)

工业相机如何实现实时和本地Raw图像和Bitmap图像的保存和相互转换(C#代码,UI界面版) 工业相机图像格式工业相机实现Raw图像和Bitmap图像的保存和转换的技术背景在相机SDK中获取图像转换图像的代码分析工业相机回调函数里保存Bitmap图像数据工…

太阳系三体模拟器

介绍 《三体》是刘慈欣创作的长篇科幻小说,文中提到的三体问题比较复杂和无解。 该项目代码就是利用 Python 来模拟三体的运行,此项目代码完全共享,欢迎下载。 我们可以自己通过调整天体的初始坐标、质量和矢量速度等等参数来自定义各种场景…

解决Golang WriteHeader设置后,Content-Type失效的问题

场景 最近笔者在研究web框架过程中,发现了一个响应类型的问题,困扰许久,原因就是设置了响应状态码后,然后设置响应类型为application/json。在实际请求后,响应类型变成了text/plain; charsetutf-8格式。 问题解决&…

RPA 培训前期准备指南——安装Uibot(RPA设计软件)

目录 一、电脑环境要求 二、所需的软件 2.1 办公软件 Office 版本: 2.2 Chrome 谷歌浏览器: 2.3 钉钉软件:官网下载 2.4 UiBot Creator 机器人流程自动化软件及 Chrome 扩展 三、UiBot Creator 安装与注册说明 (1&#xf…

公网ip数字证书申请流程

SSL数字证书是一种安全通信协议,它使用加密技术来保护在网络上传输的数据的机密性和完整性。当一个网站使用SSL数字证书时,它可以在浏览器和网站之间建立一条加密通道,确保用户在网站上输入的信息,如用户名、密码、信用卡信息等&a…

Halcon顶帽运算top_hat

Halcon顶帽运算 顶帽运算的原理是用原始的二值图像减去开运算的图像。开运算的目的是“移除”某些局部像素,如去毛边、断开相邻的边缘等。而顶帽运算正是用来提取这些被移除的部分。图(a)为从二值图像中提取出的亮的区域,可见有一…

什么?想学Go语言的人有福了?

最新好多小伙伴想学习云原生,但是都不知道怎么去学,我建议他们先去学一下G语言,作为云原生基础语言。 但是告诉我说找不到Go语言学习资料??? 好嘛,我连夜整理了几十本Go语言学习的pdf资料&…

【C#】知识点实践序列之Lock简单解决并发引起数据重复问题

欢迎来到《小5讲堂之知识点实践序列》文章,大家好,我是全栈小5。 这是2024年第3篇文章,此篇文章是C#知识点实践序列文章,博主能力有限,理解水平有限,若有不对之处望指正! 本篇在Lock锁定代码块基…

.NET DevOps 接入指南 | 1. GitLab 安装

引言 容器、DevOps和微服务被称为驱动云原生快速发展的三架马车。而DevOps是其中非常重要的一环,DevOps 是由Developers(Dev)和Operations(Ops)两个单词简称组成,中文直译就是“开发运维一体化”。 DevOps…

SpringBoot+SSM项目实战 苍穹外卖(08) 用户下单支付 内网穿透cpolar软件 绕开微信支付实现

继续上一节的内容,本节导入地址簿功能代码,并实现用户下单和订单支付功能。 这里写目录标题 导入地址簿功能代码接口分析代码实现 用户下单接口分析代码实现 订单支付内网穿透——cpolar软件代码导入绕开微信支付实现 导入地址簿功能代码 地址簿&#x…