【SpringMVC】——Cookie和Session机制

 8e19eee2be5648b78d93fbff2488137b.png

阿华代码,不是逆风,就是我疯

你们的点赞收藏是我前进最大的动力!!

希望本文内容能够帮助到你!!

目录

一:实践

1:获取URL中的参数

(1)@PathVariable

2:上传文件

(1)普通写法

(2)@RequestPart

 (3)注意

二:获取Cookie和Session

1:状态

2:Cookie

​编辑 3:Session

4:两者区别

5:获取Cookie代码实现

(1)普通代码

(2)lambda表达式

(3)注解形式

 6:Cookie造假

7:Session存储

(0)获取session

(1)第一次发送请求

(2)构架Session对象

(3)第二次请求

8:Seesion读取

 9:精华总结

(1)公共部分提取

(2)提取公共部分封装成HttpSession

(3)封装获取属性

一:实践

1:获取URL中的参数

(1)@PathVariable

路径变量这个注解主要作⽤在请求URL路径上的数据绑定

默认传递参数写在URL上,SpringMVC就可以获取到

注意①请求路径中不能再{password}对应的地方写个字符串类型,尽管url是字符串类型,但是最后到服务器上转化为的是Integer类型

注意②下面这段代码中括号中的参数是连续赋值的这样一个过程

@RequestMapping("m1/{password}/{name}")public String m1(@PathVariable("password") Integer id , @PathVariable("name") String name){return "id是:" + id +"    name是:" + name;}

29b35454261441359d9b03671c4f2577.png

2:上传文件

(1)普通写法

@RequestMapping("m2")public String getfile(MultipartFile file){String fileName = file.getOriginalFilename();return "接受到的文件的名称为:" + fileName;}

af11837cb03a49b394c4d1a7b443db3f.png

(2)@RequestPart

@RequestPart这个注解可以作为中间商进行传参

@RequestMapping("m2")public String getfile(@RequestPart("fileTemp") MultipartFile file){String fileName = file.getOriginalFilename();return "接受到的文件的名称为:" + fileName;}

 (3)注意

上传的文件体积可能会过大,此时就要注意看日志了,往往错误的日志信息才是提升自己代码能力的关键

二:获取Cookie和Session

1:状态

理解状态和无状态:HTTP是一种无状态协议,什么是无状态呢?

无状态:在服务器和客户端的连接中,不保存对端信息。在下一次再连接时,需要再次验证身份。

有状态:类似第一次去医院,需要办理一张就诊卡,把身份信息登记一下,再看病。第二次再去医院的时候,直接刷卡,工作人员就知道你是谁了,不需要再走登记身份信息的流程了

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

2:Cookie

下述图中的 "令牌" 通常就存储在 Cookie 字段中
此时在服务器这边就需要记录"令牌"信息, 以及令牌对应的⽤⼾信息, 这个就是 Session 机制所做的⼯作.

0d5afc7a768b46289f8230865974a888.png

3cb8af2f10bc481ea2c851094125b93b.png 3:Session

服务器同⼀时刻收到的请求是很多的. 服务器需要清楚的区分每个请求是从属于哪个⽤⼾, 也就是属于哪个会话, 就需要在服务器这边记录每个会话以及与⽤⼾的信息的对应关系.
Session是服务器为了保存⽤⼾信息⽽创建的⼀个特殊的对象
25985e57db92452cb05eddeedc705432.png
Session的本质就是⼀个 "哈希表", 存储了⼀些键值对结构. Key 就是SessionID, Value 就是⽤⼾信息(⽤⼾信息可以根据需求灵活设计).
0cdb4f8d10994344af87cdfb8f8e07ed.png
(1)模拟具体流程
①当⽤⼾登陆的时候, 服务器在 Session 中新增⼀个新记录, 并把 sessionId返回给客⼾端. (通过
HTTP 响应中的 Set-Cookie 字段返回).
②客⼾端后续再给服务器发送请求的时候, 需要在请求中带上 sessionId. (通过 HTTP 请求中的
Cookie 字段带上).
③服务器收到请求之后, 根据请求中的 sessionId在 Session 信息中获取到对应的⽤⼾信息, 再进⾏后续操作.找不到则重新创建Session, 并把SessionID返回
Session 默认是保存在内存中的. 如果重启服务器则 Session 数据就会丢失

4:两者区别

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

5:获取Cookie代码实现

(1)普通代码

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

(2)lambda表达式

 @RequestMapping("m3_5")public String m3_5(HttpServletRequest request , HttpServletResponse response){Cookie[] cookies = request.getCookies();if(cookies != null){Arrays.stream(cookies).forEach(ck-> System.out.println(ck.getName() + " " + ck.getValue()));}return "获取Cookie";}

(3)注解形式

RequestMapping("m3.2")public String m3_2(@CookieValue("bite") String bite){return "bite:" + bite;}

Spring MVC是基于 Servlet API 构建的原始 Web 框架, 也是在Servlet的基础上实现的
HttpServletRequest , HttpServletResponse 是Servlet提供的两个类, 是Spring
MVC⽅法的内置对象. 需要时直接在⽅法中添加声明即可.
HttpServletRequest 对象代表客⼾端的请求, 当客⼾端通过HTTP协议访问服务器时,HTTP请
求头中的所有信息都封装在这个对象中,通过这个对象提供的⽅法,可以获得客⼾端请求的所有信
息.
HttpServletResponse 对象代表服务器的响应. HTTP响应的信息都在这个对象中, ⽐如向客⼾
端发送的数据, 响应头, 状态码等. 通过这个对象提供的⽅法, 可以获得服务器响应的所有内容

d8a5e98edf69480da075c014a5406c1b.png431649f2326d483eb455d8437874286c.png

 6:Cookie造假

7b37bd4bcfc240559ed4c8eafcbec18e.png

从这个例⼦中, 也可以看出Cookie是可以伪造的, 也就是不安全的, 所以使⽤Cookie时, 后端需要进⾏Cookie校验

7:Session存储

(0)获取session

获取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 会话
public String m4(HttpServletRequest request){HttpSession session = request.getSession();if(session != null){session.setAttribute("username","java");}return "session存储成功";}

简洁获取Session

①通过注解@SessionAttribute获取

先调用m6方法,获取session为null,在调用m4方法存储session,在调用m6

@RequestMapping("m6")public String m6(@SessionAttribute(value = "username" , required = false) String username){return "m6方法中返回的username参数为:" + username;}

7a454392adc640a3872ad3d965f6bab7.png

②通过Spring MVC内置对象HttpSession 来获取

@RequestMapping("m7")public String m7(HttpSession session){String username = (String) session.getAttribute("username");return "m7方法中返回的username参数为:" + username;}

(1)第一次发送请求

(2)构架Session对象

可以看到, Http请求时, 把SessionId通过Cookie传递到了服务器

(3)第二次请求

8:Seesion读取

读取 Session 可以使⽤ HttpServletRequest
Object getAttribute(String name): 返回在该 session 会话中具有指定名称的对象,如果没有指定名
称的对象,则返回 null
@RequestMapping("m5")public String m5(HttpServletRequest request){HttpSession session = request.getSession(false);String username = null;if(session != null && session.getAttribute("username") != null ){username = (String)session.getAttribute("username");}return "username:" + username;}
运行服务器,先用浏览器m5链接,再访问m4链接,最后再访问m5.可以看到下面这个有趣的现象
04ef4989874e41379139fca901e3d531.png
69a20fe26a4b44e9a8607e9cf4d97ff6.png 7a55e1b2c07e40718a572bd0fe32b355.png

 9:精华总结

客户端第一次发送请求给服务器的时候,会把自己的信息存储在请求中的Cookie字段中,服务器接收到请求后,进行解析,用session存下来Cookie中解析后的用户信息,然后把“令牌”保存在响应的set-Cookie字段中并返回给客户端,客户端接受到响应之后,下一次请求直接拿着“令牌”就可以了

(1)公共部分提取

(2)提取公共部分封装成HttpSession

(3)封装获取属性

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

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

相关文章

ROS2humble版本使用colcon构建包

colcon与与catkin相比,没有 devel 目录。 创建工作空间 首先,创建一个目录 ( ros2_example_ws ) 来包含我们的工作区: mkdir -p ~/ros2_example_ws/src cd ~/ros2_example_ws 此时,工作区包含一个空目录 src : . └── src1 directory, …

MySQL查询数据被截断

说明:本文记录一个MySQL查询,返回数据被截断的问题; 场景 假设有个用户查询列表,查询条件中有个用户类型(普通用户、大会员、黄金大会员、铂金大会员、至尊大会员),是个下拉列表,可…

华为云计算HCIE-Cloud Computing V3.0试验考试北京考场经验分享

北京试验考场 北京考场位置 1.试验考场地址 北京市海淀区北清路156号中关村环保科技示范园区M地块Q21楼 考试场选择北京,就是上面这个地址,在预约考试的时候会显示地址,另外在临近考试的时候也会给你发邮件,邮件内会提示你考试…

GDPU Android移动应用 Broadcast Receiver

聆听广播,跟着节拍吧。 计时器 新建一个名为PhoneStateMonitor的工程; 实现一个应用运行时长的计时器,并在界面上刷新计数器,要求包括: (1)在Layout中包含两个TextView控件,横向分…

数据库SQL——什么是实体-联系模型(E-R模型)?

目录 什么是实体-联系模型? 1.实体集 2.联系集 3.映射基数 一对一(1:1) 一对多(1:n) 多对一(n:1) 多对多(m:n) 全部参与: 4.主码 弱实体集&#xf…

共筑开源技术新篇章 | 2024 CCF中国开源大会盛大开幕

在这个技术革新日新月异的时代,开源精神如同点燃创新火焰的火种,照亮了无数技术探索者的征途。2024年11月9日,备受瞩目的2024 CCF中国开源大会在深圳这座充满活力的创新之城盛大开幕。这场开源领域的顶级盛事,以“湾区聚力 开源启…

[极客大挑战 2019]Secret File 1

[极客大挑战 2019]Secret File 1 审题 看到题目应该是一道简单的按照要求找flag的题目 知识点 跟着题目走 解题 一,查看源码 找到网站进入 点开发现 【注意它说没看清吗】 二,使用BP抓包试试 发现新出现了/action.php 抓到后放到Repeater中响应 得…

初识Electron 进程通信

概述 Electron chromium nodejs native API,也就是将node环境和浏览器环境整合到了一起,这样就构成了桌面端(chromium负责渲染、node负责操作系统API等) 流程模型 预加载脚本:运行在浏览器环境下,但是…

语义分割实战——基于DeepLabv3+神经网络头发分割系统源码

第一步:准备数据 头发分割数据,总共有1050张图片,里面的像素值为0和1,所以看起来全部是黑的,不影响使用 第二步:搭建模型 DeepLabV3的网络结构如下图所示,主要为Encoder-Decoder结构。其中&am…

c# 开发web服务 webserver

024-11-10<<<<<<<<<<<<<<<<<<<<<<<<<< 开始插件前Cyber_CallWeb acajax_dac_database_viewer 2024-11-10<<<<<<<<<<<<<<<<<<<<…

「C/C++」C/C++ 预处理 之 常用预处理宏

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

Javascript中如何实现函数缓存?函数缓存有哪些应用场景?

#一、是什么 函数缓存&#xff0c;就是将函数运算过的结果进行缓存 本质上就是用空间&#xff08;缓存存储&#xff09;换时间&#xff08;计算过程&#xff09; 常用于缓存数据计算结果和缓存对象 解释 const add (a,b) > ab; const calc memoize(add); // 函数缓存…

Maven的依赖管理、传递、冲突、父子工程的继承和聚合

目录 一、基于IDEA 进行Maven依赖管理 (一)依赖管理概念 (二)Maven工程核心信息配置和解读&#xff08;GAVP&#xff09; (三)Maven工程依赖管理配置 1.依赖管理和依赖添加 2.依赖版本统一提取和维护 (四)依赖范围 (五)Maven工程依赖下载失败错误解决&#xff08;重点…

iOS SmartCodable 替换 HandyJSON 适配记录

前言 HandyJSON群里说建议不要再使用HandyJSON&#xff0c;我最终选择了SmartCodable 来替换&#xff0c;原因如下&#xff1a; 首先按照 SmartCodable 官方教程替换 大概要替换的内容如图&#xff1a; 详细的替换教程请前往&#xff1a;使用SmartCodable 平替 HandyJSON …

1.2 图像处理基本操作

在本实战中&#xff0c;我们将学习如何使用OpenCV进行基本的图像处理操作。首先&#xff0c;我们将通过cv2.imread()函数读取图像&#xff0c;并使用cv2.imshow()在窗口中显示它。接着&#xff0c;我们将探索如何通过cv2.imwrite()保存图像&#xff0c;并设置不同的参数以控制图…

使用Python实现音频降噪

在音频处理领域&#xff0c;背景噪声是一个常见的问题。为了提高音频的质量&#xff0c;我们需要对音频进行降噪处理。本文将介绍如何使用 Python 实现音频降噪。 依赖库安装 在开始之前&#xff0c;我们需要安装以下依赖库&#xff1a; pydub&#xff1a;用于音频文件的读取…

与AMD GPU上的对比语言-图像预训练(CLIP)模型交互

Interacting with Contrastive Language-Image Pre-Training (CLIP) model on AMD GPU — ROCm Blogs 2024年4月16日&#xff0c;由Sean Song撰写. 引言 对比语言-图像预训练&#xff08;CLIP&#xff09;是一种多模态深度学习模型&#xff0c;连接视觉和自然语言。它在Open…

2024年第四届“网鼎杯”网络安全比赛---朱雀组Crypto- WriteUp

2024年第四届“网鼎杯”网络安全比赛---朱雀组Crypto-WriteUp Crypto&#xff1a;Crypto-2&#xff1a;Crypto-3&#xff1a; 前言&#xff1a;本次比赛已经结束&#xff0c;用于赛后复现&#xff0c;欢迎大家交流学习&#xff01; Crypto&#xff1a; Crypto-2&#xff1a; …

下载mysql的jar,添加至jmeter中,编写jdbc协议脚本1106

下载jar包&#xff1a; 步骤1&#xff1a;进入maven仓库官网https://mvnrepository.com/ 步骤2&#xff1a;搜索实际的数据库 步骤3&#xff1a;点击 Mysql connnector/J 步骤5、查看数据库的版本号&#xff0c;选择具体版本&#xff0c;我的是mysql 8.0.16,下图&#xff0c;…

从“点”到“面”,热成像防爆手机如何为安全织就“透视网”?

市场上测温产品让人眼花缭乱&#xff0c;通过调研分析&#xff0c;小编发现测温枪占很高比重。但是&#xff0c;测温枪局限于显示单一数值信息&#xff0c;无法直观地展示物体的整体温度分布情况&#xff0c;而且几乎没有功能拓展能力。以AORO A23为代表的热成像防爆手机改变了…