【Java EE】获取Cookie和Session

文章目录

  • 🎍Cookie简介
  • 🍀理解Session
  • 🌳Cookie 和 Session 的区别
  • 🌲获取Cookie
    • 🌸传统获取Cookie
    • 🌸简洁获取Cookie
  • 🌴获取Session
    • 🌸Session存储
    • 🌸Session读取
      • 🌻传统读取Session
      • 🌻简洁获取Session
  • ⭕总结

🎍Cookie简介

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

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

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

例如登陆⽹站成功后,第⼆次访问的时候服务器就能知道该请求是否是已经登陆过了.
在这里插入图片描述
想要了解详情的可以看博主写的【网络原理】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 的区别

  1. Cookie 是客⼾端保存⽤⼾信息的⼀种机制. Session 是服务器端保存⽤⼾信息的⼀种机制.
  2. Cookie 和 Session之间主要是通过 SessionId 关联起来的, SessionId 是 Cookie 和 Session 之间的桥梁
  3. Cookie 和 Session 经常会在⼀起配合使⽤. 但是不是必须配合.
  • 完全可以⽤ Cookie 来保存⼀些数据在客⼾端. 这些数据不⼀定是⽤⼾⾝份信息, 也不⼀定是 SessionId
  • Session 中的sessionId 也不需要⾮得通过 Cookie/Set-Cookie 传递, ⽐如通过URL传递.

🌲获取Cookie

🌸传统获取Cookie

@RequestMapping("/m10")
public String method10(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

@RequestMapping("/getCookie")
public String cookie(@CookieValue("bite") String bite) {
 return "bite:" + bite;
}

注意:

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

🌴获取Session

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

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

🌸Session存储

@RequestMapping("/setSess")
public String setsess(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;
    }

⭕总结

感谢大家的阅读,希望得到大家的批评指正,和大家一起进步,与君共勉!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

tsc --init 报错

运行 tsc --init 报错, 全局安装 ts 也不行 通过 npx tsc --init 就可以解决

创建大量栅格文件并分别写入像元数据:C++ GDAL代码实现

本文介绍基于C语言GDAL库,批量创建大量栅格遥感影像文件,并将数据批量写入其中的方法。 首先,我们来明确一下本文所需实现的需求。已知我们对大量遥感影像进行了批量读取与数据处理操作——具体过程可以参考文章C GDAL提取多时相遥感影像中像…

python开发poc,fofa爬虫批量化扫洞

学习使用python做到批量化的漏洞脚本 1.通过fofa搜索结果来采集脚本 2.批量化扫描漏洞 ---glassfish存在任意文件读取在默认48484端口,漏洞验证的poc为: "glassfish" && port"4848" && country"CN" http://loca…

渗透学习第一天:DR4G0N B4LL靶场复现

0x00 环境搭建 攻击机为kali Linux,IP为192.168.71.129 靶机IP地址目前不知道,但是是和kali同网段的 0x01 信息收集 由于不知道目标的IP地址,这里我采用了arp scan对本机的整个网段进行扫描 发现目标IP为192.168.71.130。对目标IP进行端…

新品攻略—小功率、小体积、高效率!LED驱动模块RSC6218A

瑞森半导体(REASUNOS)推出应用在5W-18W LED电源上的LED驱动模块RSC6218A。 LED驱动模块RSC6218A是一款LLC 谐振拓扑功率模块,带有半桥驱动的控制电路和功率转化器件,适用于 LED 恒流控制线路,电路工作频率可达200KHz。…

MATLAB绘采用低通滤波处理加噪方波信号

MATLAB绘采用低通滤波处理加噪方波信号 clc;close all;clear all;warning off;%清除变量 rand(seed, 100); randn(seed, 100); format long g;% MATLAB代码:绘制加噪方波并采用低通滤波后绘制图像 % 参数设置 Fs 1000; % 采样频率 T 1/Fs; …

“更大的焦虑,更大的想象力”:音视频厂商如何闯入AI时代?

从GPT3.5到GPT4.0,从Runway、Pika到Sora,当大模型的价值链不断升级,那些暂未爬到顶端的企业,还剩下多少‘生存空间’? 于音视频厂商而言,企业要解决的难题是,如何将技术与用户连接在一起。让大…

PPE-个人防护装备如何定义?为什么说PPE是劳动者的护身神器?

个人防护用品定义 PPE,即个人防护装备、个人防护用具或劳保用品,是劳动场所中不可或缺的重要组成部分。它们扮演着保护工人免受各种危害的关键角色。从安全帽到反光衣,再到防护手套和安全鞋,PPE覆盖了各个方面,为工人…

线性变换在人工智能领域的深度实践与应用探索

线性变换,作为数学中的一种基本工具,在人工智能领域中发挥着举足轻重的作用。其强大的表示能力和灵活的运算特性使得线性变换成为机器学习、深度学习等多个子领域的核心组成部分。本文将详细探讨线性变换在人工智能领域中的实践应用,旨在揭示…

Qt plugin 开发UI界面插件

目录 1.创建接口 2.创建插件 3.创建插件界面 4.插件实现 5.创建应用工程 6.应用插件 1.创建接口 打开QtCreater,点击左上角“文件”->新建文件或项目,在弹窗中选择C/CHeader File。 输入文件名,选好路径(可自行设置名称…

HarmonyOS 开发-二级联动

介绍 本示例主要介绍了List组件实现二级联动(Cascading List)的场景。 该场景多用于短视频中拍摄风格的选择、照片编辑时的场景的选择。 效果图预览 使用说明: 滑动二级列表侧控件,一级列表随之滚动。点击一级列表,…

【数据交换格式】网络socket编程温度采集智能存储与上报项目技术------JSON、TLV

作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生在读,研究方向无线联邦学习 擅长领域:驱动开发,嵌入式软件开发,BSP开发 作者主页:一个平凡而乐于分享的小比特的个人主页…

【单片机】74HC4052电路图,单片机端口复用电路

74HC4052电路图 如下图,还是很好理解,PA9、PA10是单片机引脚。 当A和B是00,那么就是X-COM和0X短路,Y-COM和0Y短路。 当A和B是01,那么就是X-COM和1X短路,Y-COM和1Y短路。 以此类推。 74HC 工艺可以直接3.…

网传桌面版telegram RCE 0day

网传根据区块链安全公司CertiK发布的一份新报告,CertiK 发现Telegram桌面版的处理媒体文件过程,可能存在RCE漏洞。此漏洞会使用户面临特制媒体文件(例如图像或视频)的恶意攻击。 CertiK Alert 于 4 月 9 日在社交媒体平台 X 上警…

冯喜运:4.10周三外汇现货黄金原油走势分析及操作建议

黄金走势分析:黄金目前的波动已经基本没有什么技术面可言了,现在主要就是重点看市场消息面影响所造成的砸盘力度情况,但当下不管是战争因素所带来的避险情绪影响还是美国降息与否所带来的经济影响都无疑还是支撑着黄金继续走高,那…

使用labelImg标注数据集

1 Labelimg下载 Labelimg下载地址http:// https://github.com/tzutalin/labelImg下载得到的压缩包解压 建议使用Anaconda安装 使用管理员运行Anaconda Prompt,激活虚拟环境,在labelImg-master目录下执行命令 conda install pyqt=5 pyrcc5 -o libs/resources.py resources…

Linux下批量的批量操作

批量删除docker 镜像 docker images | grep ent-form-web |awk ‘{print $3}’ | xargs docker rmi docker images: 列出所有的docker 镜像 docker images | grep ent-form-web : 选取出结果带 ent-form-web的信息 docker images | grep ent-form-web |awk ‘{print $3}’ 选取…

高效实现红黑树范围查询:RB-ENUMERATE操作的设计与分析

高效实现红黑树范围查询:RB-ENUMERATE操作的设计与分析 一、RB-ENUMERATE操作的需求分析二、RB-ENUMERATE操作的设计思路三、RB-ENUMERATE操作的具体实现四、性能分析五、结论 在红黑树的广泛应用中,我们经常需要对树中的元素进行查询和操作。除了基本的…

gr::log :INFO: packet_headerparser_b0 - Detected an invalid packet at item问题记录

文章目录 前言一、OFDM 帧结构设计二、源码修改三、运行结果前言 在使用 GNU Radio 对 OFDM 进行帧结构设计时,出现了如下的警告信息: gr::log :INFO: packet_headerparser_b0 - Detected an invalid packet at item 724224 gr::log :INFO: header_payload_demux0 - Parser …

【QT入门】 Qt自定义控件与样式设计之QCheckBox qss实现按钮开关

往期回顾 【QT入门】Qt自定义控件与样式设计之QPushButton常用qss-CSDN博客 【QT入门】 Qt自定义控件与样式设计之QPushButton实现鼠标悬浮按钮弹出对话框-CSDN博客 【QT入门】 Qt自定义控件与样式设计之QComboBox样式表介绍-CSDN博客 【QT入门】 Qt自定义控件与样式设计之QChe…