【Java EE】获取Cookie和Session

news2024/11/26 13:32:42

文章目录

  • 🎍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;
    }

⭕总结

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

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

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

相关文章

内网IP与外网IP关联关系连接过程

前言 我们每天都会访问各种各样的网站,比如淘宝,百度等等。不免会思考,我们的设备是如何连接上这些网址的呢?要想搞清楚这个问题,首先就得先搞清楚内网ip和外网ip的联系。 网络结构 如图,假设我们的计算机…

IP协议中的四大支柱:DHCP、NAT、ICMP和IGMP的功能剖析

DHCP动态获取 IP 地址 我们的电脑通常都是通过 DHCP 动态获取 IP 地址,大大省去了配 IP 信息繁琐的过程。 客户端首先发起 DHCP 发现报文(DHCP DISCOVER) 的 IP 数据报,由于客户端没有 IP 地址,也不知道 DHCP 服务器的…

短剧在线搜索PHP网站源码

源码简介 短剧在线搜索PHP网站源码,自带本地数据库500数据,共有6000短剧视频,与短剧猫一样。 搭建环境 PHP 7.3 Mysql 5.6 安装教程 1.上传源码到网站目录中 2.修改【admin.php】中, $username ‘后台登录账号’; $passwor…

Android 14.0 SystemUI修改状态栏电池图标样式为横屏显示

1.概述 在14.0的系统rom产品定制化开发中,对于原生系统中SystemUId 状态栏的电池图标是竖着显示的,一般手机的电池图标都是横屏显示的 可以觉得样式挺不错的,所以由于产品开发要求电池图标横着显示和手机的样式一样,所以就得重新更换SystemUI状态栏的电池样式了 如图: 2.S…

通信分类3G,4G,5G,通信专用名词

Generation: 2G: GSM全名为:Global System for Mobile Communications,中文为全球移动通信系统,俗称"全球通",是一种起源于欧洲的移动通信技术标准,是第二代移动通信技术 3G:WCDMA 4G&#xff1a…

PaddleVideo:onnx模型导出

本文节介绍 PP-TSM 模型如何转化为 ONNX 模型,并基于 ONNX 引擎预测。 1:环境准备 安装 Paddle2ONNX python -m pip install paddle2onnx 安装 ONNXRuntime # 建议安装 1.9.0 版本,可根据环境更换版本号 python -m pip install onnxrunti…

flask 访问404

当你的项目有自己的蓝图,有添加自己的前缀,也注册了蓝图。 在访问的路由那里也使用了自己的蓝图,如下图 然后你访问的地址也没问题,但是不管怎么样访问就是返回404,这个时候不要怀疑你上面的哪里配置错误,…

彩虹聚合DNS管理系统源码

聚合DNS管理系统可以实现在一个网站内管理多个平台的域名解析,目前已支持的域名平台有:阿里云、腾讯云、华为云、西部数码、CloudFlare。本系统支持多用户,每个用户可分配不同的域名解析权限;支持API接口,支持获取域名…

标注平台工作流:如何提高训练数据质量与管理效率

世界发展日益依托数据的驱动,企业发现,管理不断增长的数据集却愈发困难。数据标注是诸多行业的一个关键过程,其中包括机器学习、计算机视觉和自然语言处理。对于大型语言模型(LLM)来说尤是如此,大型语言模型…

Spring之AOP的详细讲解

目录 一.SpringAOP是什么? 1.1理论知识点 1.2简单的AOP例子 二.SpringAOP的核心概念 2.1切点(Pointcut) 2.2通知(Advice) 2.3切⾯(Aspect) 2.4通知类型 2.5切⾯优先级 Order 2.6切点表达式 2.6.1 execution表达式 2.6.2annotati…

【绘图案例-开启图片类型的上下文withOptions Objective-C语言】

一、上午呢,我们讲了一下图片类型的上下文 1.开启图片类型的上下文:UIGraphicsBeginImageContext, 然后,我们在上边儿,画了一些东西, 然后呢,把它取出来了,通过UIGraphicsGetImageFromCurrentImageContext() 通过这个图片类型的上下文,取出来了一个image对象, …

邦火策划真的靠谱吗?餐饮品牌策划实例解析

邦火策划在餐饮品牌策划领域的表现是否靠谱,可以通过具体的实例来进行解析。以下是一些相关的实例分析,以探讨邦火策划在餐饮品牌策划方面的真实效果和专业性。 首先,从品牌塑造与传播的角度来看,邦火策划注重通过精准的市场定位…

element-plus报错TypeError: data.includes is not a function

发生在vue3中,页面报错。 查找原因,表格中的data初始值定义不是数组 改一下 再试就好了

【面试精讲】MyBatis设计模式及源码分析,MyBatis设计模式实现原理

【面试精讲】MyBatis设计模式及源码分析,MyBatis设计模式实现原理 目录 本文导读 一、MyBatis中运用的设计模式详解 1. 工厂模式(Factory Pattern) 2. 单例模式(Singleton Pattern) 3. 建造者模式(Bu…

GEE图表案例——不同区域各地类面积直方图分布图表(矢量面积叠加直方图图)

简介 在GEE中对不同区域面积统计的直方图绘制具体流程如下: 数据准备: 首先,需要准备用于面积统计的地理数据,可以是矢量数据,如行政边界、土地使用类型等。也可以是栅格数据,如分类结果、土地覆盖数据等。 区域划分: 根据需要统计的区域,将数据进行区域划分。可以使用…

电商技术揭秘七:搜索引擎中的SEO关键词策略与内容优化技术

文章目录 引言一、关键词策略1.1 关键词研究与选择1. 确定目标受众2. 使用关键词研究工具3. 分析搜索量和竞争程度4. 考虑长尾关键词5. 关键词的商业意图6. 创建关键词列表7. 持续监控和调整 1.2 关键词布局与密度1. 关键词自然分布2. 标题标签的使用3. 首次段落的重要性4. 关键…

00后应届毕业生面试要一万,面试官:不好意思,我们给不起

前几天,小编收到了即将毕业的表弟发来的私信,说他刚刚面试一家单位被刷了。表弟专业学的不错,人也十分聪明,家里人们都对这个面试结果感到吃惊,一问才知,被刷的理由很简单:开了10K的工资&#x…

FPGA笔试面试题目记录

1 logic utilization 题目:Rank the following operations from lowest utilization to highest. Assume that all variables are 32-bit integers,that the operations are implemented using LUTs ony and that the synthesiser will produce an optimal digital…

基于springboot实现医院管理系统项目【项目源码+论文说明】

基于springboot实现医院管理系统演示 摘要 随着信息互联网信息的飞速发展,医院也在创建着属于自己的管理系统。本文介绍了医院管理系统的开发全过程。通过分析企业对于医院管理系统的需求,创建了一个计算机管理医院管理系统的方案。文章介绍了医院管理系…

cesium 动态墙效果 电子围栏效果

一、扩展材质 /*** 动态墙材质* param {*} options* param {String} options.color 颜色* param {Number} options.duration 持续时间 毫秒* param {String} options.trailImage 贴图地址*/function DynamicWallMaterialProperty(options) {this._definitionChanged new Cesi…