无状态HTTP的“记忆”高效的方案:Spring Boot中CookieSession全栈实战

news/2025/10/20 14:36:43/文章来源:https://www.cnblogs.com/wzzkaifa/p/19152597

在这里插入图片描述


开发者资源导航
️ 博客主页: 个人主页
 专栏订阅: JavaEE全栈专栏

1. 什么是Cookie/Session?

http是无状态的,没有记忆力的,本次的通信和下次的通信是没有关联的,而在实际开发中是需要联系的。

那么能想到什么方法来解决它呢?存储!将信息存储起来建立关联。

但是网页是不被允许访问本地文件的,因此我们没办法将信息以文件的形式存储在本地。

我们只能将信息存储在服务器上面,而这些信息又被称之为“会话”,也就是Session。

我们的存储问题得到了解决,但是这样又会出现一个新的问题,如何将让客户端找到自己的Session呢?

Cookie就是两者关联的关键机制,Cookie是一种被允许存储在浏览器本身上的一种信息,当访问服务端时,Cookie会被一并带过去,这样服务端就能根据Cookie找到之前的会话状态。

一个典型的例子就是:

  • 当我们在一个网站上登录以后,之后的很长时间都不需要再次登录。

在浏览器中,我们点击F12可以直接查看到Cookie的存储信息:

2. 获取/设置Cookie

2.1传统方式

HttpServerletRequest和HttpServletResponse 是serverlet里面的东西,可以用来接受请求/响应,可以使用该类获取到请求/响应中的关键信息,在使用时,它的位置可以随意放 spring在看到它的时候会自动传给他。

设置Cookie:

    @GetMapping("/set-cookie")public String setCookie(HttpServletResponse response) {// 创建一个Cookie,名称为 "username",值为 "JohnDoe"Cookie cookie = new Cookie("username", "JohnDoe");// 设置Cookie的有效期(单位:秒),例如1小时cookie.setMaxAge(60 * 60);// 可选:设置Cookie的路径,通常设为 "/" 表示整个应用可用cookie.setPath("/");// 可选:设置是否仅通过HTTPS传输// cookie.setSecure(true);// 可选:设置是否仅通过HTTP访问,防止JavaScript访问(增强安全性)// cookie.setHttpOnly(true);// 将Cookie添加到响应中response.addCookie(cookie);return "cookie-set-success"; // 返回视图名称}

此时我们可以从浏览器中看到设置Cookie成功了。

注意:cookie的key值只能存在一个,如果设置的Cookie已经存在会覆盖掉旧的Cookie值。

获取Cookie:

    @RequestMapping("/cookies")public String cookies(HttpServletRequest request) {Cookie[] cookies = request.getCookies();if (cookies != null) {for (Cookie cookie : cookies) {System.out.println(cookie.getName() + ":" + cookie.getValue());}}return "yes";}

此时的结果会在编译器的终端上打印出来:

2.2 注解方式

@CookieValue可以获取到指定名称的Cookie值,但是缺点是只能获取到单一值,因此并不常用。

    @RequestMapping("/cookies1")public String cookies1(@CookieValue("username") String name) {return "username:" + name;}

结果:

3. 获取/设置Session

3.1 传统方式

Cookie和Session的连接通过一个sessionId的Cookie值来进行传递的,服务器会使用哈希表来自动保存和设置他们两者之间的映射关系,方便之后的查询。

设置Session:

getSession()内部参数可以传入一个布尔值,默认为ture

如果为true,没有获取到session时,自动创建并返回一个空的Session对象。

如果为false,没有获取到session时,返回null。

    @RequestMapping("/setsession")public String setSession(HttpServletRequest request) {//根据cookie自动去获取sessionid,再根据sessionid去获取session对象,//因为默认是true,所以如果没有找到id会创建一个新的session//session是存储在内存里面的HttpSession session = request.getSession();//可以设置为参数,这样就是动态的了session.setAttribute("name","lyf");session.setAttribute("age",90);return "设置成功";}

此处我们运行成功后就多了一个Cookie值,它的作用就是用于连接服务器的会话状态,它的设置是自动的,并不需要我们手动进行。

我们也可以简化一下获取Session的方式,直接使用HttpSession作为传参类型,通过这样的方式获取相当于使用getSession方法传入了一个true的值,不存在时自动创建一个空的Session。

    @RequestMapping("/setsession")public String setSession(HttpSession session) {session.setAttribute("name","lyf");session.setAttribute("age",90);return "设置成功";}

获取Session值:

    @RequestMapping("/getsession")public String getSession(HttpServletRequest request) {//也是根据cookie去获取session,如果没找到这个session说明没有使用过setsession//也就没有session,可以认为没有登陆过HttpSession session = request.getSession(false);if (session == null) {return "no design infomation";}String name = (String)session.getAttribute("name");return "name:" + name;}

结果:

3.2 注解方式

通过@SessionAttribute注解直接获取当前会话的值,传入的参数是key值。

    @RequestMapping("/getsession1")public String getSession1(@SessionAttribute("name") String name) {return "name:" + name;}

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

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

相关文章

LLM 笔记 —— 01 大型语言模型修炼史(Self-supervised Learning、Supervised Learning、RLHF) - 实践

LLM 笔记 —— 01 大型语言模型修炼史(Self-supervised Learning、Supervised Learning、RLHF) - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: b…

深入解析:【面试前必看:Redis 从入门到实战:核心知识与面试高频考点全解析】

深入解析:【面试前必看:Redis 从入门到实战:核心知识与面试高频考点全解析】2025-10-20 14:30 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflo…

4-8〔O҉S҉C҉P҉ ◈ 研记〕❘ WEB应用攻击▸命令注入漏洞 - 实践

4-8〔O҉S҉C҉P҉ ◈ 研记〕❘ WEB应用攻击▸命令注入漏洞 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

2025年项目管理工具生态全景:技术主权与AI赋能的行业变革

2025年项目管理工具生态全景:技术主权与AI赋能的行业变革 随着生成式AI、量子计算与混合现实技术的迅猛发展,全球项目管理工具市场正在经历前所未有的结构性变革。这场由技术驱动的产业升级不仅重塑了工作协同方式,…

sqlalchemy 密码@ 处理, 以及ssl连接处理

from grant.sql_connection import tellus_conn from sqlalchemy import text, create_engine import pandas as pd from urllib.parse import quote_pluspassword = "123z@W2823in" encoded_password = quo…

el-dialog 嵌套遮罩灰色问题

<el-dialog> 嵌套遮罩灰色问题1 说明在一个<el-dialog> 里面打开另外一个<el-dialog> ,发现新打开的是灰色的,需要点一下才正常2 处理在两个<el-dialog> 都加上以下属性:append-to-body=&qu…

Microsoft 代理框架简介(预览版):让每个开发人员都能轻松使用 AI 代理

Microsoft 代理框架简介(预览版):让每个开发人员都能轻松使用 AI 代理 引言 人工智能代理(AI Agents)正逐渐成为现代软件开发的重要组成部分,它们能够结合推理、上下文和工具来追求特定目标。然而,许多开发人员…

winform连接锐浪GridReport打印示例

using grproLib; using LRTMS.Common; using LRTMS.DB; using LRTMS.Report; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using Syste…

2025 年破碎机厂家最新推荐榜,聚焦企业技术实力与市场口碑深度解析圆锥/辊式/对辊/煤矸石/砂石破碎机厂家推荐

引言在矿山开发、冶金加工、建材生产等核心领域,破碎机作为关键生产装备,其性能与品质直接决定项目生产效率、资源利用率及综合成本。当前市场上破碎机品牌数量繁杂,部分厂商缺乏核心技术支撑,设备运行稳定性差、故…

AI 的能源危机:训练一个模型究竟要耗掉多少电?

💬一、前言:AI 在变聪明,地球却在“变热” ChatGPT、Claude、Gemini、Mistral……一个比一个聪明。但你可能没想到——每当它们“开窍”一次,地球的电表也要疯狂转上几圈。 有研究估计:训练 GPT-4 级别的大模型,…

2025 年制砂机厂家最新推荐榜,聚焦企业技术实力与市场口碑深度解析高效/冲击式/砂石/新疆制砂机厂家推荐

引言 当前矿山开发、建筑建材等领域对制砂机需求持续增长,但市场品牌繁杂,部分产品存在技术落后、环保不达标、售后缺失等问题,企业选购时常面临设备适配难、后期保障不足的困境。为帮助企业精准筛选优质制砂机品牌…

拆解3D Gaussian Splatting:原理框架、实战 demo 与自驾仿真落地探索!

3D场景重建卡在哪儿?建模以月计、数据难复用、仿真不逼真! 看3DGS技术如何破局!从原理拆解到实战演练,揭秘如何用“3D色块”实现日级高保真重建,打通从真实世界到数字仿真的快车道!01 引言 当前,三维重建技术正…

Hyper-V 与 root的Android7模拟器共存

下载安装Android Studio 安装Android7android-24\default\x86Rootemulator -avd Phone -writable-system -selinux permissive abd root abd remount adb install SuperSU/common/Superuser.apk adb push SuperSU/x86/…

基于深度学习的CT扫描图像肝脏肿瘤智能检测与分析系统【python源码+Pyqt5界面+数据集+训练代码】 - 实践

基于深度学习的CT扫描图像肝脏肿瘤智能检测与分析系统【python源码+Pyqt5界面+数据集+训练代码】 - 实践2025-10-20 14:16 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: nor…

resend 单次发送命令

Invoke-WebRequest -Uri "https://api.resend.com/emails" `-Method Post `-Headers @{"Authorization" = "Bearer re_"} `-ContentType "application/json; charset=utf-8" …

视频监控界的“万能翻译器”:视频汇聚平台EasyCVR视频接入功能全解读

在数字化转型浪潮中,企业、政府单位常常面临一个共同的痛点:海量的监控设备品牌不一、协议各异,形成了众多的“信息孤岛”。如何将这些分散的、异构的视频资源进行统一汇聚、管理和应用?本文将深入解析EasyCVR视频…

PCIe 全高/半高,全长/半长 尺寸介绍 - ENGINEER

PCIe 全高/半高,全长/半长 尺寸介绍PCIe 全高全长尺寸​维度上限高度 H​111.15 mm​长度 L​312.00 mm​以上为业界常用的 PCIe 板卡尺寸上限,适用于标注为“全高全长(FHFL)”的扩展卡;不同厂商成品可能因散热器…

Android脱壳

已root的Android 7 安装Xposed鸭, FDex2, 待脱壳应用 使用FDex获得dex文件 dex转jar: d2j-dex2jar.bat a.dex, 会生成a-dex2jar.jar java -jar jd-gui-1.6.6.jar可选Save All Sources或将jar文件解压后针对单独文件夹压…

Linux框架编程:线程控制

Linux框架编程:线程控制pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &q…