当前位置: 首页 > news >正文

「Spring MVC」Session、Cookie

🎇个人主页:Ice_Sugar_7
🎇所属专栏:JavaEE
🎇欢迎点赞收藏加关注哦!

Spring MVC

  • 🍉Session & Cookie
    • 🍌联系与区别
  • 🍉获取 Cookie
  • 🍉存储 & 获取 Session
  • 🍉获取 Header

🍉Session & Cookie

首先了解一下什么是会话

计算机领域中, 会话指的是一个客户端与服务器之间不中断的请求响应,对于客户端的请求,服务器能够知道这些请求都来自于同个客户
当一个未知的客户向 Web 应用程序发送第一个请求时,会话就开始了
当客户明确结束会话或服务器在一个时限内没有接收到该客户的任何请求时,会话就结束了

服务器在同一时刻会收到很多请求,此时就需要区分每个请求来自哪个客户, 也就是属于哪个会话, 这就需要服务器记录每个会话、与客户的信息的对应关系
Session 是服务器为了保存用户信息而创建的特殊的对象

在这里插入图片描述

Session 本质是一个哈希表, 存储了一些键值对。其中 Key 就是 SessionID,Value 就是用户信息(用户信息可以根据需求灵活设计)

  1. 用户登录时, 服务器在 Session 中新增一个记录, 并把 sessionId 返回给客户端 (通过 HTTP 响应中的 Set-Cookie 字段返回)
  2. 客户端后续再给服务器发送请求时, 需要在请求中带上 sessionId (通过 HTTP 请求中的 Cookie 字段带上
  3. 服务器收到请求之后, 根据请求中的 sessionId 在 Session 信息中获取到对应的用户信息, 再进行后续操作。若找不到,则重新创建 Session, 并返回 SessionID

在这里插入图片描述
说完 Session, 接下来回顾一下之前提过的 Cookie
首先我们需要知道, HTTP 协议是无状态的协议。无状态指的是 HTTP 协议的客户端和服务器之间的某次通信, 和下次通信之间没有直接联系
不过实际开发中, 我们很多时候需要知道请求之间的关联关系

比如成功登录网站后, 第二次访问的时候服务器就能知道该请求是否已经登录过,如果之前登录过,那就无需再次进入登录页面了,在这个过程中,浏览器和服务器进行如下的交互过程

在这里插入图片描述

上图提到的令牌通常存储在 Cookie 字段中, 令牌又称为 Token。前文提到的 SessionId 就是一种令牌


🍌联系与区别

Cookie 和 Session 之间主要通过 SessionId 关联起来
Cookie 是客户端保存用户信息的一种机制;Session 是服务器端保存用户信息的一种机制

二者通常会在⼀起配合使用,但不是必须配合。比方说,完全可以⽤ Cookie 把⼀些数据保存在客户端,这些数据不⼀定是用户⾝份信息, 也不⼀定是 SessionId。而 Session 中的 sessionId 也不是说一定得通过 Cookie/Set-Cookie 传递,还有别的传递方式,比如通过URL传递


🍉获取 Cookie

先来认识 Servlet 提供的两个类:HttpServletRequestHttpServletResponse,它们是 Spring MVC 方法的内置对象
可将这两个类的对象分别视为是 HTTP 请求和响应封装成的对象,换而言之,HTTP 请求里面有啥,对应的 HttpServletRequest 对象里面就有啥。响应也是同理

代码如下:

@RequestMapping("req11")
public String req11(HttpServletRequest request, HttpServletResponse response) {//获取所有 Cookie 的信息Cookie[] cookies = request.getCookies();//打印 Cookie 的信息StringBuilder sb = new StringBuilder();if(cookies != null)for(Cookie cookie : cookies)sb.append(cookie.getName() + ":" + cookie.getValue());return "Cookie 中的信息为:" + sb;
}

在这里插入图片描述

这个例子可以看出:Cookie 是可以伪造的, 也就是说不安全, 所以使用 Cookie 时, 后端需要校验 Cookie


🍉存储 & 获取 Session

由于 Session 存储在服务器中,所以我们需要先存储,然后才可以获取。它也是基于 HttpServletRequest 来存储和获取的

HttpSession getSession()  //获取 Session,若不存在,则会新建一个 Session
void setAttribute(String name, Object value)  //使用指定名称绑定一个对象到该 Session 会话
@RequestMapping("req12")
public String req12(HttpServletRequest request) {HttpSession session = request.getSession(); //获取 Session 对象if(session != null) session.setAttribute("username","zhangsan"); //把"zhangsan"这个对象绑定到 username 这个会话中return "session 存储成功";
}

getSession 操作内部会提取请求中 Cookie 的 SessionId, 然后根据 SessionId 获取到对应的 Session 对象

Object getAttribute(String name) //返回该 Session 会话中具有指定名称的对象,如果没有,则返回 null
@RequestMapping("req13")
public String req13(HttpServletRequest request) {HttpSession session = request.getSession(false); //如果 Session 不存在,不会自动创建一个,而是返回 nullString username = null;if(session != null && session.getAttribute("username") != null)username = (String)session.getAttribute("username");return "username:" + username;
}

也可以通过 Spring MVC 内置对象 HttpSession 来获取,这种方式比较简洁


🍉获取 Header

Header 也是从 HttpServletRequest 中获取,使用 getHeader 方法

@RequestMapping("req15")
public String req15(HttpServletRequest request) {String userAgent = request.getHeader("User-Agent");return "userAgent:" + userAgent;
}

浏览器运行结果:

在这里插入图片描述

使用 Fiddler 抓包观察 UserAgent 是否正确

在这里插入图片描述
同样也有简洁的办法获取 Header:

@RequestMapping("req15")
public String req15(HttpServletRequest request) {String userAgent = request.getHeader("User-Agent");return "userAgent:" + userAgent;
}

相关文章:

「Spring MVC」Session、Cookie

🎇个人主页:Ice_Sugar_7 🎇所属专栏:JavaEE 🎇欢迎点赞收藏加关注哦! Spring MVC 🍉Session & Cookie🍌联系与区别 🍉获取 Cookie🍉存储 & 获取 Sess…...

Java虚拟机:垃圾回收器

大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 037 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进一步完善自己对整个 Java 技术体系来充实自…...

ES6-ES13学习笔记

初识ES6 ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了。它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。 1997年:EC…...

【Qt开发】QtCharts图表——在ui上添加QChartView控件并进行绘图配置

【Qt开发】QtCharts图表——在ui上添加QChartView控件并进行绘图配置 文章目录 控件安装和模块导入在ui上添加QChartView控件QChartView图表配置附录:C语言到C的入门知识点(主要适用于C语言精通到Qt的C开发入门)C语言与C的不同C中写C语言代码…...

Android14 屏幕录制(屏幕投影)和音频播放采集

Android 5开始支持屏幕采集, Android 10支持音频播放采集&#xff0c;不过Android 14用前台服务做屏幕录制时要增加一些处理. 1. app manifest 需要增加: <manifest><uses-permission android:name"android.permission.FOREGROUND_SERVICE" /><uses…...

一行实现88个群智能算法优化混合核极限学习机HKELM的多特征输入单输出的数据回归预测Matlab程序全家桶

一行实现88个群智能算法优化混合核极限学习机HKELM的多特征输入单输出的数据回归预测Matlab程序全家桶 文章目录 前言一行实现88个群智能算法优化混合核极限学习机HKELM的多特征输入单输出的数据回归预测Matlab程序全家桶 一、HKELM模型1. 极限学习机&#xff08;ELM&#xff0…...

redis面试(十五)公平锁队列重排

队列重拍 先说一下当前的加锁状态 anyLock由客户端A持有队列中是客户端B、客户端C并且客户端B现在是排在头部 那么队列重拍就是队列中某个客户端长时间没有重新申请加锁&#xff0c;没有刷新分数&#xff0c;就会被队列中挤掉。 假设这个长时间没有加锁的客户端是B。 总结 …...

python 基础语法os模块

一、os模块 待总结 二、os.path模块 1.abspath()方法--获取绝对路径 abspathO)方法用于返回文件或者目录的绝对路径。 语法格式如下: os .path.abspath(path) 参数说明: path:表示要获取绝对路径的相对路径&#xff0c;可以是文件也可以是目录。 返回值:返回获取到的绝…...

图论------迪杰斯特拉(Dijkstra)算法求单源最短路径。

编程要求 在图的应用中&#xff0c;有一个很重要的需求&#xff1a;我们需要知道从某一个点开始&#xff0c;到其他所有点的最短路径。这其中&#xff0c;Dijkstra 算法是典型的最短路径算法。 本关的编程任务是补全右侧代码片段中 Begin 至 End 中间的代码&#xff0c;实现 …...

河工院首届工业设计大赛程序组(挑战赛)题解

更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验 寻找ACMer 思想&#xff1a; 签到题按照题意遍历字符串&#xff0c;不断向后寻找包含 ACMer 完整字符串的数量即可 std标程&#xff1a; #include <iostream> #include <cstring> #include …...

文件上传漏洞(二,靶场搭建及漏洞利用)

前言&#xff1a; 本文基于github上的upload-labs&#xff0c;PHP study以及bp抓包软件进行操作。 一&#xff0c;靶场搭建。 靶场链接 1&#xff0c;下载zip文件到PHP study下的www文件夹内&#xff0c;并解压。 2&#xff0c;创建网站。 此处php版本应选择较老版本&…...

大厂面试题分享第二期

大厂面试题分享第二期 如果执行了一条命令&#xff0c;"select count(*)from…"&#xff0c;使用哪个引擎更快&#xff0c;为什么&#xff1f;垃圾回收器 CMS 和 G1的区别介绍一下CMS和G1CMS&#xff08;并发&#xff09;垃圾收集器G1垃圾回收器 HTTPS和HTTP的区别主…...

zabbix安装

a.安装 Zabbix 仓库 # rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm # yum clean all b. 安装 Zabbix server、前端、agent # yum install zabbix-server-mysql zabbix-agent c. 安装Zabbix前端 启用红帽软件集合 # …...

SpringBoot集成日志框架

SpringBoot集成日志框架 Java生态体系日志框架介绍 简介 在Java生态体系中&#xff0c;围绕着日志&#xff0c;有很多成熟的解决方案。关于日志输出&#xff0c;主要有两类工具。 一类是日志框架&#xff08;Log4j、Logback&#xff09;&#xff0c;主要用来进行日志的输出的…...

CSS笔记总结(Xmind格式):第三天

Xmind鸟瞰图&#xff1a; 简单文字总结&#xff1a; css知识&#xff1a; 边框线&#xff1a; 1.border-width:边框的粗细 2.border-style:边框线的样式(solid实线,double双实线,dotted点线&#xff0c;dashed虚线) 3.border-color:边框线的颜色 4.简写形式&a…...

WordPress原创插件:Keyword-ranking-seo 1.0 关键词排名插件 有利于seo

WordPress原创插件&#xff1a;Keyword-ranking-seo 1.0 关键词排名插件 有利于seo 当用户访问网站时&#xff0c;该链接会随机选择一个关键词&#xff0c;并使用选定的搜索引擎进行搜索。 插件下载链接 https://download.csdn.net/download/huayula/89632792...

Docker Swarm 管理

Docker Swarm 是 Docker 提供的一种用于管理容器集群的工具。一、Docker Swarm 的主要特点包括&#xff1a; 高可用性&#xff1a;可以自动检测和恢复故障节点&#xff0c;确保服务的持续可用性。 例如&#xff0c;当某个工作节点出现故障时&#xff0c;Swarm 会将其上的任务重…...

跨平台、多格式、云同步,Koodo Reader背后的技术亮点

前言 对于像我这样的书虫来说&#xff0c;能够找到一个既方便又舒适的阅读环境&#xff0c;简直就是人生中的一大幸事&#xff1b;今天&#xff0c;就让小江湖我带你走进一个不一样的阅读世界——Koodo Reade&#xff01; 无论是在喧嚣的都市&#xff0c;还是在宁静的乡村&a…...

【Story】如何高效记录并整理编程学习笔记?

目录 一、为何笔记在编程学习中如此重要&#xff1f;1.1 知识的捕捉1.2 理解和消化1.3 知识的复习1.4 知识的分享 二、建立高效的笔记系统2.1 确定笔记的目标2.2 选择合适的工具2.3 笔记的结构化2.4 记录有效的内容2.5 定期回顾和更新 三、保持笔记条理性的技巧3.1 使用一致的格…...

jenkins 安装以及自动构建maven项目并且运行

在这里找到你对应jdk的版本的jenkins包 War Jenkins Packages 我这里用的使java8,所以下载 https://mirrors.jenkins.io/war-stable/2.60.1/jenkins.war 然后jenkins可以安装到centos系统 在本地windows系统运行命令行 scp C:\Users\98090\Downloads\jenkins.war root@192…...

云原生本地开发新范式:LDLT方法论与实践指南

1. 项目概述&#xff1a;从“LDLT”看云原生时代的本地开发范式革新如果你是一名云原生应用的开发者&#xff0c;大概率经历过这样的场景&#xff1a;为了调试一个微服务&#xff0c;你需要在本地启动一整套依赖——数据库、消息队列、缓存、甚至其他几个关联服务。你的开发机内…...

AI驱动的网络安全:深度学习与LLM在威胁检测与教育中的应用

1. 项目概述&#xff1a;AI赋能的网络安全新范式在网络安全领域&#xff0c;我们正面临着一个日益严峻的悖论&#xff1a;一方面&#xff0c;攻击手段正变得前所未有的复杂和自动化&#xff1b;另一方面&#xff0c;74%的安全事件仍然源于人为因素。这种技术与人的双重挑战催生…...

别再到处找激活码了!手把手教你用vlmcsd在Windows上自建KMS服务器(附各版本密钥)

企业级Windows批量激活解决方案&#xff1a;安全高效的本地KMS部署指南 在数字化办公环境中&#xff0c;批量激活Windows操作系统一直是IT管理员面临的常见挑战。传统单机激活方式效率低下&#xff0c;而依赖外部KMS服务器又存在连接不稳定、隐私泄露等潜在风险。本文将深入探讨…...

从零到一:联想小新Air14 2020锐龙版Windows 10重装实战指南

1. 为什么需要重装系统&#xff1f; 最近有不少朋友跟我吐槽&#xff0c;说用了两年的联想小新Air14 2020锐龙版越来越卡&#xff0c;开机要等半天&#xff0c;打开个文档都要转圈圈。这种情况我太熟悉了&#xff0c;作为一个帮朋友修过不下20台同款机型的老司机&#xff0c;我…...

OpenClaw 汉化版 Windows 一键安装指南|零基础 5 分钟部署 告别命令行

前言 在本地部署 AI 智能体时&#xff0c;英文界面晦涩、命令行操作复杂、环境配置繁琐&#xff0c;是很多零基础用户的三大痛点。OpenClaw 汉化中文版专为国内用户优化&#xff0c;采用全中文图形化界面 免环境配置 一键部署设计&#xff0c;全程无任何命令行操作&#xff…...

如何快速解锁网易云音乐NCM格式:ncmdumpGUI完整免费解决方案指南

如何快速解锁网易云音乐NCM格式&#xff1a;ncmdumpGUI完整免费解决方案指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换&#xff0c;Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经遇到过这样的困扰&…...

爱普生SG-8201CJ石英可编程振荡器:精准频率控制专家首选

在电子设计中&#xff0c;晶振的选择往往是决定系统性能的关键因素之一。特别是在需要高精度和稳定性的应用中&#xff0c;选择一款合适的晶振尤为重要。今天&#xff0c;我们就来聊聊爱普生&#xff08;Epson&#xff09;的SG-8201CJ石英可编程振荡器&#xff0c;看看它如何成…...

别再纠结剪胀角了!用Abaqus CAE五分钟搞定库伦摩尔模型的材料卡设置(含黏土/砂土参数模板)

别再纠结剪胀角了&#xff01;用Abaqus CAE五分钟搞定库伦摩尔模型的材料卡设置&#xff08;含黏土/砂土参数模板&#xff09; 岩土工程仿真中&#xff0c;材料参数设置往往是新手的第一道门槛。当你在Abaqus中面对十几个输入框时&#xff0c;是否也曾困惑&#xff1a;摩擦角和…...

ExplorerPatcher完整指南:轻松定制Windows界面,打造专属工作环境

ExplorerPatcher完整指南&#xff1a;轻松定制Windows界面&#xff0c;打造专属工作环境 【免费下载链接】ExplorerPatcher This project aims to enhance the working environment on Windows 项目地址: https://gitcode.com/GitHub_Trending/ex/ExplorerPatcher 还在为…...

SAP销售单文本处理保姆级教程:用SAVE_TEXT和READ_TEXT BAPI搞定抬头备注

SAP销售单文本处理实战指南&#xff1a;从业务需求到代码实现的完整闭环 销售订单处理过程中&#xff0c;文本信息承载着关键业务逻辑——加急标识、特殊包装要求、客户备注等非结构化数据往往决定了后续物流和财务流程的准确性。当这些信息在流转中丢失时&#xff0c;轻则导致…...