【Spring】Cookie和Session

news2024/9/20 20:42:42

系列文章目录

第一章 初识Spring MVC


文章目录

  • 系列文章目录
  • 前言
  • 一、Cookie和Session
  • 二、Cookie操作
    • 获取Cookie
    • 指定Cookie
  • 三、Session操作
    • 设置Session数据
    • 获取Session数据
  • 四、获取Header
  • 总结


前言

HTTP是"无状态"的协议,我们可以理解为它没有记忆力。无论来了多少次,他都会从头到尾重新执行。但是我们希望它能够在特定的情况下存在“记忆”,以账号密码为例,我们希望进入网站时存储着以前使用过的账号密码。这就需要借助Cookie和Session的帮助了。


一、Cookie和Session

**Cookie存在客户端中。Session存放在服务器中。 **
以CSDN为例,当我们进入CSDN后需要登录才能进行更多操作,在之后的一段时间里,我们都不需要重新进行登录操作,CSDN也能够直接获取到我们的信息。

  1. 登录后服务器创建Session存储信息,并通过set-Cookie 将SessionID 存放在Cookie中。
  2. 在客户端后续再给服务器发送请求时,都需要在请求中带上SessionId
  3. 服务器收到请求后,将请求中的SessionId在对应的Session中获取到对应的信息,再进行后续操作。
  4. 如果找不到对应的Session 就会重新创建Session 并把SessionID返回。

二、Cookie操作

在客户端中,Cookie是可以伪造的,我们可以通过开发者模式设置Cookie。在下文中都会通过伪造Cookie的方式作为数据。
在这里插入图片描述

获取Cookie

我们可以通过代码操作获取到Cookie,SessionID也只是Cookie中的一部分。
在下面的代码中,HttpServletRequest 操作中都有对Cookie的相关设置包括获取和添入。

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

Cookie中的数据有效时间大概是半小时左右,我们也可以对它进行设置。因此即使我们重新运行程序,Cookie在短时间内也不会消失。而运行这段代码的结果如下图所示

在这里插入图片描述

指定Cookie

在上面我们获取Cookie是获取全部的Cookie,我们也可以使用Spring的注解 @CookieValue 指定获取Cookie中的指定数据
在http://127.0.0.1:8080/中我们伪造Cookie三个数据,接下来我们通过代码获取指定的数据name,通过注解指定的name赋值到方法参数中。
在这里插入图片描述

	@RequestMapping("/getCookie2")
    public String getCookie2(@CookieValue("name") String name) {
        System.out.println("获取到Cookie:" + name);
        return "获取Cookie成功";
    }

在这里插入图片描述

三、Session操作

与Cookie一样,我们也可以通过代码去获取Session和设置Session中的数据。
在HttpServletRequest类中不只有getCookie,同时也有对应的Session方法。

设置Session数据

Session是服务器中的数据,是无法像Cookie那样在客户端伪造的。因此提供了setAttribute方法设置Session中的数据。
在下面的代码中,首先调用了getSession方法,旨在查看该网站中是否原本就存在Session 如果存在,就继续在原Session下进行数据管理;如果不存在Session,就创建Session.
设置参数值为true即当不存在Session时,创建一个新的Session

	@RequestMapping("/setSession")
    public String setSession(HttpServletRequest request) {
        HttpSession session = request.getSession(true);
        session.setAttribute("name","zhangsan");
        session.setAttribute("age","111");
        return "设置Session成功";
    }

代码运行结果如下,在运行代码之后,我们可以看到除了原先伪造的Cookie,还多了一个“JSESSIONID” 里面存储的就是SessionID等关于Session的数据。
在这里插入图片描述

获取Session数据

在获取Session数据中,同样的我们可以使用HttpServletRequest提供的getAttribute方法获取数据

	@RequestMapping("/getSession")
    public String getSession(HttpServletRequest request) {
        //如果参数为false 不存在session时返回null
        HttpSession session = request.getSession(false);
        if (session != null) {
            System.out.println(session.getAttribute("name"));
            System.out.println(session.getAttribute("age"));
        }
        return "成功获取Session";
    }

代码结果如下
在这里插入图片描述
为了方便,Java又提供了一个类HttpSession对session进行操作。与HttpServelet类相比,它不需要进行参数值设置,当session为null时就会自动创建出一个新的Session
同时带有一个注解@SessionAttribute 设置required为false时为非必填项。
我们可以通过这个注解获取指定的参数数据。

	@RequestMapping("/getSession3")
    public String getSession3(@SessionAttribute(value = "name",required = 
    false) String name) {
        System.out.println("name:" + name);
        return "成功获取Session";
    }

在这里插入图片描述

四、获取Header

与前两个一样,使用的还是HttpServletRequest类中的getHeader方法
在下面的代码中我们获取Header中的User-Agent数据

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

运行结果如下图
在这里插入图片描述
同样的可以指定元素进行赋值

	@RequestMapping("/getHeader2")
    public String getHeader2(@RequestHeader("USer-Agent") String 
    userAgent) {
        return "userAgent:" + userAgent;
    }

总结

Cookie和Session是网站开发中一个关键的节点,连通服务器和客户端之间的桥梁。
本文通过HttpServletRequest类对Cookie、Session、Header进行设置以及获取操作。
同时,在注解方面,@CookieValue、@SessionAttribute、@RequestHeader注解都能够获取指定属性的数据。
源码可见Cookie和Session

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

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

相关文章

UnrealEngine学习(02):虚幻引擎编辑器界面详解

学习一款软件,我个人建议是先学习怎么用,然后是学习怎么用的好,再研究源码。 上一篇文章详细描述了我们该如何安装虚幻5引擎: UnrealEngine学习(01):安装虚幻引擎https://blog.csdn.net/zuodingquan666/article/deta…

Kubernetes存储Volume

数据是一个企业的发展核心,他涉及到数据存储和数据交换的内容。在生产环境中尤为重要的一部分,在 Kubernetes 中另一个重要的概念就是数据持久化 Volume。 一、Volume的概念 对于大多数的项目而言,数据文件的存储是非常常见的需求,比如存储用…

SEO优化租用站群服务器需要考虑哪些?

在SEO(搜索引擎优化)的背景下,站群服务器是一种运行多个网站的器,每个网站共享同一个IP地址,但也可拥有独立IP。下面将详细探讨SEO使用站群服务器租用需要考虑的各种因素,rak小编为您整理发布。 1. 网站内容的原创性与相关性 内容…

淘客系统源码的架构分析

淘客系统的架构分析可以从多个层面进行探讨,包括业务流程、技术选型、系统模块、安全性、可扩展性等方面。 业务流程:淘客返利系统的主要业务流程包括用户注册、商品推广、订单跟踪、返利结算等。用户注册成功后,将获得推广链接,…

html+css+js网页设计 电商 珠宝珠宝行业的专业领域应用先状、前沿及发展展望13个页面

htmlcssjs网页设计 电商 珠宝珠宝行业的专业领域应用先状、前沿及发展展望13个页面 网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编…

Python新手必看!这个模块让Python的重试更加便捷灵活!

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 Python重试 📒📝 安装📝 使用📝 进阶使用⚓️ 相关链接 ⚓️📖 介绍 📖 在Python编程中,网络请求、数据库操作或任何可能因外部因素而失败的场景中,错误重试显得尤为重要。它能有效减少因暂时性问题导致的程序崩溃…

【Qt CMake】Qt5Widgets.dll:-1: error: LNK1107: 文件无效或损坏: 无法在 0x308 处读取

项目场景: CMake 编译QT 工程 编译报错 E:\tool\Qt5.15.2\5.15.2\msvc2019_64\bin\Qt5Widgets.dll👎 error: LNK1107: 文件无效或损坏: 无法在 0x308 处读取 问题描述 Cmkae 报错: E:\tool\Qt5.15.2\5.15.2\msvc2019_64\bin\Qt5Widgets.dll…

大模型入门到精通——使用Embedding API及搭建本地知识库(二)

搭建并使用向量数据库 前序基础知识参考链接介绍:大模型入门到精通——使用Embedding API及搭建本地知识库(一) 搭建并使用向量数据库,因此读取数据后我们省去数据处理的环节直入主题 基于 LangChain 实现 README.md 相关文档的向数据库搭建&#xff…

小工具网址集合(不定期更新)

1、网络小说聚合工具 网址:https://502book.com/ 一个挺不错的搜索工具,聚合了多个网站的小说搜索工具,直接搜索就可以了,自动解析多个站点的内容,可以直接在网页上观看,比较方便。 2、图片水印工具 网址&a…

高效遍历受限秩树:DFS算法设计与C语言实现

高效遍历受限秩树:DFS算法设计与C语言实现 前言算法设计伪代码C语言代码示例算法分析扩展应用结论前言 给定一个树(或图),其中每个节点的秩(可以理解为子节点数量或某种复杂度度量)最多为 [lgn],其中 n 是树中节点的总数。我们需要设计一个算法来高效遍历或处理这样的树…

SAP如何定义跨不同服务器系统实现 表数据自动传输

一.首先定义一个表 二.定义表维护生成器生成视图 三.SOBJ更改传输配置 最后检查下业务配置情况即可 End:如果不能自动传输可以包请求传输 1.创建请求 2.选中要传输的数据 3.包含请求 点击保存 不点保存请求包的是空的(示例图片是灰的是我没有创建请求&…

兰州大学和南京农业大学等研究团队《Nature Communications 》揭示升高的温度和CO2强烈影响土壤细菌的生长策略!

本文首发于“生态学者”微信公众号! 微生物基于特征的策略似乎在系统发育上是保守的,但对气候变化的适应可能会使情况复杂化。为了研究系统发育和环境在细菌对湿度突然增加的响应中的作用,本研究团队在土壤中通过18O-DNA定量稳定同位素探测(1…

Android12平台上支持spi屏处理

对于Android平台默认是没有支持spi屏的。通常是支持显示接口的屏,例如:rgb,lvds,edp,lvds,mipi等lcd屏。 对于spi屏我们该如何进行适配,以我手上这款oled的spi屏介绍 一、spi平常规原理图及屏端接口介绍 对于软件开发来说,主要用到RS,CS,CLK,SDA,TE几个脚,其他电压管脚交…

滴水逆向三期笔记与作业——02C语言——11 指针(1)

接着水。 滴水逆向三期笔记与作业——02C语言——11 指针(1) 一、指针的宽度1.1 基础类型宽度1.2 一级指针宽度1.3 二级指针宽度1.4 四级指针宽度1.5 总结 二、指针声明三、指针赋值四、指针的运算4.1 或--运算4.2 加减一个整数4.3 求差值4.4 比较 五、作…

【总结】技术总监说nginx配置https都不会,立即、马上开掉!

原文:https://mp.weixin.qq.com/s/7mAH6XyME8ixy8l5-ACpvg 工作中经常会遇到需要手动安装部署nginx,为了安全起见,上线后都需要开启https,本文将从安装部署,一步一步操作,最终实现nginx编译安装&#xff0…

ai写作生成器免费哪个好?这4个ai写作生成器嘎嘎好使

秋雨绵绵,云南的山水间仿佛被施了魔法,每一滴雨珠都像是大自然赋予的buff,让这片土地的美景更加动人。在这诗意盎然的季节里,如果写作也能像这秋雨一样,自然而富有魔力,那该有多好~ 幸运的是,现…

idea怎么从commit信息中打开对应文件

点击Commit 右击想要打开的文件,点击Jump to Source

Veeco电源维修RF600 RF全系列射频电源维修

美国维易科VEECO RF600是为实验室设计的600W可编程直流电源, 研究开发和生产环境,功率要求从10 mW到600 W不等。无论负载或线路条件如何,它都能提供高度准确和稳定的直流输出功率, 使其非常适合各种高功率实验和生产测试应用。 RF600具有广泛的输出电压和电流值选择,以及一系列…

vuejs 源代码启动 调试

vuejs源代码启动 调试 1.项目启动 下载pnpm npm install pnpm -g安装依赖 pnpm install启动 npm run dev启动后会生成packages\vue\dist\vue.global.js,这个文件为实时更新的源码打包文件,我们调试源码需要引入这个文件 2.创建study/myVue.vue文件&…

Improved Baselines with Visual Instruction Tuning

总结 1. 改进:LLAVA-1.5 基于LLAVA架构,提出了LLAVA-1.5,通过简单的修改(如使用MLP投影和增加学术任务相关数据)建立了更强的基线。在11个基准测试中,LLAVA-1.5实现了最先进的性能,尽管仅使用…