Spring MVC(二)

介绍 Cookie 与 Session

Session 类似哈希表,存储了一些键值对结构,Key 就是 SessionID,Vaule 就是用户信息,客户端发起会话的时候,服务器一旦接收,就会创建会话【也就是 Session】,通过 Session 保存客户端的信息,一般使用 Set-Cookie 来将 SessionID 存储在 客户端的 Cookie 中,然后客户端在接下来的请求就会带上这个 ID ,这样服务器就可以识别是哪个客户端发来的请求,做出相应的响应。

在这里插入图片描述

在这里插入图片描述

Cookie 存储在客户端上,Session 存储在服务端,一般我们通过 Set-Cookie ,将 SessionID 存储在 Cookie 中。

Cookie 和 Session 的区别:
1)Cookie 是客户端保存用户信息的一种机制,Session 是服务器端保存用户信息的一种机制
2)Cookie 和 Session 之间主要通过 SessionID 关联起来,SessionID 是 Cookie 和 Session 之间的桥梁
3)Cookie 和 Session 经常配合在一起使用,但不是一定要配合。例如:可以完全使用 Cookie 来保存一些数据在客户端上,这些数据不一定是用户的身份信息,也不一定是SessionID;Session 中的 sessionID 也不需要非得通过 Cookie / Set-Cookie 传递,比如通过 URL 传递。


http 是无状态的
无状态可以理解为服务器是没有记忆力的,由于服务器一般是和多台客户端进行交互的,因此服务器要想知道是哪一个客户端发来的请求,请求需要保存客户端的信息,这样服务器才能通过这些信息查询是哪个客户端,这些信息就是令牌【令牌除了包含 SessionID之外,还可以有其他用户信息】
客户端在发送请求的时候,需要带上这个令牌,这样服务器就认识这个哪个客户端了。

http 无状态是一个良好的设计,一般我们使用多个服务器对外提供服务,正因为 http 是无状态的【客户端就不需要绑定特定的服务器来进行交互】,所以即使其中一个服务器负荷了,这个客户端的请求也可以被其他服务器处理。

在这里插入图片描述

以登录为例子:
用户登录时,服务器会在 Session 中创建一个新的记录,并把 SessionID 返回给客户端,通过 HTTP 响应中的
Set-Cookie 字段返回
客户端后续再给服务器发送请求时,需要在请求中带上 SessionID,通过 HTTP 请求中的 Cookie 字段带上
服务器收到请求之后,根据请求中的 SessionID 在 Session 信息中获得对应的用户信息,再进行后续的操作,
如果找不到则重新创建 Session,并把 SessionID 返回

HttpServletRequest

SpringMVC 是基于 Servlet api 构建的原始 Web 框架,也是在 Servlet 的基础上实现的

HttpServletResquest 代表客户端的请求

Cookie

在 postman 如何设置 Cookie???
首先点击 Headers,设置 Cookie 就可以了。

在这里插入图片描述

    @RequestMapping("/r5")public String r5(HttpServletRequest request) {Cookie[] cookies = request.getCookies();if(cookies != null) {for(Cookie c : cookies) {System.out.println(c.getName() + ": " + c.getValue());}}return "成功获取Cookie 信息";}

@CookieValue(简易获取 Cookie)

    @RequestMapping("/r6")public String r6(@CookieValue("java") String java) {return java;}

设置 Cookie

在这里插入图片描述

Session

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

存储和设置 Session

通过 HttpServletRequest 获取 Session ,本质上就是通过 SessionID 在服务端内找寻 Session,然后进行响应的设置。如果没有 SessionID 或者 没有找到对应 的 Session ,服务端就会创建 Session.

调用 setAttribute 方法来进行设置 Session 操作

    @RequestMapping("/r9")public String r9(HttpServletRequest request) {HttpSession session = request.getSession();session.setAttribute("userName","java");session.setAttribute("age","20");return "设置 Session 成功";}

还可以直接通过 HttpSession 来进行获取:

@RequestMapping("/r10")public String r10(HttpSession session) {session.setAttribute("userName", "java");session.setAttribute("age",20);return "获取 Session 成功!";}

下面的浏览器发送的请求:

在这里插入图片描述

下面是通过 postman 发送请求的数据包:

在这里插入图片描述

从上面的 Session ID 佐证了不同的客户端的 ID 是不同的。


当你使用 HttpServletRequest 的获取 Session (调用 getSession),如果没有获取到 Session,这个方法会默认让服务端创建 Session ,保证获取到 的 Session 不为 null.
如果你调用的是 getSession(false) 的话,如果查询不到 Session 是不会默认创建 Session 的

例如:客户端需要先登录才能进行下一步的操作,如果没有登录的话,就查询不到Session ,这时候要先提醒客户端先进行登录操作,然后等待用户填写完登录信息,我们才创建 Session,将 SessionID 设置到 Cookie

 @RequestMapping("r11")public String r11(HttpServletRequest request) {HttpSession session = request.getSession(false);if(session == null) {return "请先登录";}return "开始下一步的操作";}

获取 Session 内的数据

通过 getAttribute 来获取

    @RequestMapping("/r12")public String getSession(HttpSession session) {return (String) session.getAttribute("userName");}

通过 @SessionAttribute

    @RequestMapping("/r13")public String getSession2(@SessionAttribute("userName") String userName) {return userName;}
  @RequestMapping("/r13")public String getSession2(@SessionAttribute(value = "userName",required = false) String userName) {return userName;}

获取 Header

通过 HttpServletRequest

    @RequestMapping("r14")public String getHeader(HttpServletRequest request) {String urerAgent = request.getHeader("User-Agent");return "从 header 中获取 User-Agent:" + urerAgent;}

通过 RequestHeader

    @RequestMapping("r15")public String r15(@RequestHeader("User-Agent") String userAgent) {return "从 header 中获取 User-Agent:" + userAgent;}

HttpServletResponse

HttpServeltResponse 代表 服务器的响应

我们可以通过 HttpServletResponse 来设置响应数据包。

设置状态码

调用 setStatus

    @RequestMapping("r18")public String r18(HttpServletResponse response) {response.setStatus(500);return "设置 http 状态码成功";}

在这里插入图片描述

注意 状态码即使被你设置为 四百多或者 五百多,都不会影响到数据包的正常接收处理。

在这里插入图片描述

设置 Header

响应里也有 Header 部分,我们也可以进行相应的设置。
通过 setHeader 来设置,使用键值对方式,两个字符串分别对应键 和 值。

在这里插入图片描述

    @RequestMapping("r19")public String r19(HttpServletResponse response) {response.setHeader("java","17");response.setHeader("hello","world");return "设置 response 的 header 成功";}

在这里插入图片描述

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

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

相关文章

spark运行流程

spark运行流程 任务提交后,先启动 Driver 程序随后 Driver 向集群管理器注册应用程序集群管理器根据此任务的配置文件分配 Executor 并启动Driver 开始执行 main 函数,Spark 查询为懒执行,当执行到 Action 算子时开始反向推 算,根…

【数据资产】数据资产管理概述

导读:数据资产管理在企业的数字化转型和业务发展中扮演着至关重要的角色。它直接关系到企业的决策效率、运营优化、业务创新以及风险防控等多个方面。数据资产作为企业的重要战略资源,能够为企业带来经济利益,其价值可能来自于数据本身的稀缺…

Qt中Widget及其子类的相对位置移动

Qt中Widget及其子类的相对位置移动 最后更新日期:2025.01.25 下面让我们开始今天的主题… 一、开启篇 提出问题:请看上图,我们想要实现的效果是控件黄色的Widge(m_infobarWidget)t随着可视化窗口(m_glWidge…

Mybatis配置文件详解

MyBatis通过XML或注解的方式将Java对象与数据库中的记录进行映射,极大地简化了数据访问层的开发。而在MyBatis的核心组成部分中,配置文件扮演着举足轻重的角色。它不仅定义了MyBatis的运行环境,还配置了数据源、事务管理、映射器等关键元素&a…

怎样在PPT中启用演讲者视图功能?

怎样在PPT中启用演讲者视图功能? 如果你曾经参加过重要的会议或者演讲,你就会知道,演讲者视图(Presenter View)对PPT展示至关重要。它不仅能帮助演讲者更好地掌控演讲节奏,还能提供额外的提示和支持&#…

算法-加油站问题

hello 大家好!今天开写一个新章节,每一天一道算法题。让我们一起来学习算法思维吧! function canCompleteCircuit(gas, cost) {// 加油站的总数const n gas.length;// 记录总剩余油量,若总剩余油量小于 0,说明无法绕环…

蓝桥杯模拟算法:蛇形方阵

P5731 【深基5.习6】蛇形方阵 - 洛谷 | 计算机科学教育新生态 我们只要定义两个方向向量数组,这种问题就可以迎刃而解了 比如我们是4的话,我们从左向右开始存,1,2,3,4 到5的时候y就大于4了就是越界了&…

MOS的体二极管能通多大电流

第一个问题:MOS导通之后电流方向可以使任意的,既可以从D到S,也可以从S到D。 第二个问题:MOS里面的体二极管电流可以达到几百安培,这也就解释了MOS选型的时候很少考虑体二极管的最大电流,而是考虑DS之间电流…

java语法学习

目录 一、基础语法 1.注释 2.关键字 3.字面量 4.变量 定义与使用 存储 5.数据类型 6.标识符 7.集成环境 二、运算符 1.概念 2.种类 算术运算符 除法与取模 转化规则 自增减 赋值运算符 关系运算符 逻辑运算符 短路运算符 三元运算符 其它运算符 三、流…

CAN总线

1. 数据帧(Data Frame) 数据帧是 CAN 总线中最常用的帧类型,用于传输实际的数据。其结构如下: 起始位(Start of Frame, SOF):标志帧的开始。标识符(Identifier)&#x…

Autosar-Os是怎么运行的?(Os基础模块)

写在前面: 入行一段时间了,基于个人理解整理一些东西,如有错误,欢迎各位大佬评论区指正!!! 书接上文 Autosar-Os是怎么运行的?(一)-CSDN博客 目录 1.Resourc…

如何使用 DeepSeek API 结合 VSCode 提升开发效率

引言 在当今的软件开发领域,API 的使用已经成为不可或缺的一部分。DeepSeek 是一个强大的 API 平台,提供了丰富的功能和数据,可以帮助开发者快速构建和优化应用程序。而 Visual Studio Code(VSCode)作为一款轻量级但功…

【ComfyUI专栏】推荐几个常用的云端ComfyUI平台

如果我们本身的系统资源不足,但是我们依然能够使用显卡来利用ComfyUI生成我们需要的图片或者视频。当前平台中主要有两个不同的廉价平台提供了ComfyUI的功能,这里提供的资源基本上都是基于分钟进行计算。这些平台的好处就是基本上不需要你额外进行配置。 一.端脑云 二.AutoD…

「数学::质数」分解质因子 / LeetCode 2521(C++)

概述 由算数基本定理,我们知道任意一个大于1的自然数可以表示为一些质数的乘积: LeetCode 2521: 给你一个正整数数组 nums ,对 nums 所有元素求积之后,找出并返回乘积中 不同质因数 的数目。 注意: 质数 是…

基于微信小程序的移动学习平台的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…

ESP32服务器和PC客户端的Wi-Fi通信

ESP32客户端-服务器Wi-Fi通信 本指南将向您展示如何设置ESP32板作为服务端,PC作为客户端,通过HTTP通信,以通过Wi-Fi(无需路由器或互联网连接)交换数据。简而言之,您将学习如何使用HTTP请求将一个板的数据发…

[笔记] 极狐GitLab实例 : 手动备份步骤总结

官方备份文档 : 备份和恢复极狐GitLab 一. 要求 为了能够进行备份和恢复,请确保您系统已安装 Rsync。 如果您安装了极狐GitLab: 如果您使用 Omnibus 软件包,则无需额外操作。如果您使用源代码安装,您需要确定是否安装了 rsync。…

NFT Insider #166:Nifty Island 推出 AI Agent Playground;Ronin 推出1000万美元资助计划

引言:NFT Insider 由 NFT 收藏组织 WHALE Members、BeepCrypto 联合出品, 浓缩每周 NFT 新闻,为大家带来关于 NFT 最全面、最新鲜、最有价值的讯息。每期周报将从 NFT 市场数据,艺术新闻类,游戏新闻类,虚拟…

Cyber Weekly #41

赛博新闻 1、豆包大模型1.5Pro正式发布 1月22日,豆包大模型1.5Pro在模型能力、多模态能力、推理能力上进行了全面升级。该模型使用MoE架构,通过训练-推理一体化设计,在较小激活参数下达到一流超大稠密预训练模型的性能,并在多个…

idea对jar包内容进行反编译

1.先安装一下这个插件java Bytecode Decompiler 2.找到这个插件的路径,在idea的plugins下面的lib文件夹内:java-decompiler.jar。下面是我自己本地的插件路径,以作参考: D:\dev\utils\idea\IntelliJ IDEA 2020.1.3\plugins\java-d…