【Spring MVC篇】Cookie和Session的获取 Header的获取

个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【Spring MVC】
本专栏旨在分享学习Spring MVC的一点学习心得,欢迎大家在评论区交流讨论💌
在这里插入图片描述

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

目录

  • 一、获取Cookie
    • 方式①
    • 方式②
  • 二、获取Session
    • 方式①
      • 存储Session
    • 方式②
    • 方式③
  • 三、获取Header
    • 方式②

一、获取Cookie

方式①

获取Cookie代码如下(使用Servlet API的方式):

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

注意:cookies一开始是空的,所以要加上if判断,演示结果如下:

在这里插入图片描述

下面来进行Cookie的伪造(F12进入开发者工具):
在这里插入图片描述
在这里插入图片描述

方式②

方式①是使用比较原始的方式(即Servlet API)来获取Cookie

现在我们重启服务器,来获取keyaaa的值:

代码如下:

@RequestMapping("/getCookie2")
public String getCookie2(@CookieValue String aaa) {return "cookie中aaa存储的值是:" + aaa;
}

在这里插入图片描述

上面的代码使用了Spring框架的@CookieValue注解来获取cookie的值。具体来说,@CookieValue注解作为方法的参数,会自动从请求中获取名为"aaa"的cookie的值,并赋给方法中的变量aaa。然后将该变量拼接到返回的字符串中,最终返回结果。

可以发现重启服务器之后仍然可以得到key为aaa中存储的值,这是因为Cookie是客户端保存用户信息的一种机制(即与浏览器有关,与服务器重启无关)

综上,Servlet API和Spring框架中的@CookieValue注解都可以获取Cookie;区别就是Servlet API可以获取请求中的所有cookie;而@CookieValue注解来直接从请求中获取指定cookie的值,将其赋给方法参数。

二、获取Session

在这里插入图片描述

方式①

使用Servlet API来获取Session,代码如下:

@RequestMapping("/getSession")
public String getSession(HttpServletRequest request) {// 服务器中每个会话都会创建一个SessionHttpSession session = request.getSession(false);// getSession根据Sessionid来获取对应的Session对象默认值为true// 当传入true时,如果请求中已经存在一个会话(即Session不为空),就返回该会话;如果没有会话(即Session为空),则创建一个新的会话并返回。// 当传入false时,如果请求中已经存在一个会话,就返回该会话;如果没有会话,则返回 null。if(session != null) {String name = (String)session.getAttribute("name");return "名称:" + name;}return "session为空";
}

结果如下:

Cookie中虽然有值,但是我们可以看到运行结果显示Session是空的(因为二者本身是没有关系的,但是可以通过Sessionid进行关联)。在这里插入图片描述
在这里插入图片描述

存储Session

Cookie和Session是通过Sessionid来进行关联的,由于Session是服务器端的,所以我们无法伪造Session,现在我们通过代码来存储Session(Session是服务器端的机制,我们需要先存储,才能再获取):

@RequestMapping("/setSession")
public String setSession(HttpServletRequest request) {HttpSession session = request.getSession();session.setAttribute("name","lisi");return "success";
}

结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如上图,在发起请求时,无论是否需要Cookie,请求中的信息都会包含Cookie信息。当服务器处理请求后,会返回响应给客户端。客户端在接收到响应后,会根据响应中包含的Set-Cookie头部字段解析和处理Cookie信息。浏览器会解析Set-Cookie头部字段,然后将Cookie保存到浏览器的Cookie存储中。

此时我们再次getSession,如下:
在这里插入图片描述

方式②

代码如下(使用了Spring MVC框架的@SessionAttribute注解来获取会话(session)中的属性值。):

@RequestMapping("/getSession2")
public String getSession2(@SessionAttribute String name) {return "name" + name;
}

我们重启服务器之后,Session就已经清空了,因为Session是存储在服务器上的(默认是存储在内存中的)。所以此时我们是拿不到数据的,请看:
在这里插入图片描述

在这里插入图片描述

重启服务器之后运行如下:
在这里插入图片描述

我们现在重新setSession:
在这里插入图片描述
然后getSession2:
在这里插入图片描述

方式③

使用Servlet API提供的HttpSession对象来获取会话(session)。

代码如下:

@RequestMapping("/getSession3")
public String getSession3(HttpSession session) {String name = (String)session.getAttribute("name");return "名称:" + name;
}

在这里插入图片描述

下面是运行结果的演示过程:
我们依然是要先setSession(因为重启了服务器):
在这里插入图片描述
然后getSession3:
在这里插入图片描述

这种方式是直接使用HttpSession对象来获取会话属性值,不需要借助注解或其他操作。

三、获取Header

使用Servlet API提供的HttpServletRequest对象来获取请求的Header信息(在方法参数中声明HttpServletRequest对象,通过Spring MVC会自动注入该对象。)。

代码如下:

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

结果如下:
在这里插入图片描述

方式②

使用Spring MVC提供的@RequestHeader注解来获取请求的Header信息。

代码如下:

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

结果如下:

在这里插入图片描述
好了,以上就是本文的全部内容了。希望各位友友可以一键三连哈!!!

在这里插入图片描述

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

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

相关文章

mlxtend,一个非常好用的 Python 库!

前言 Python 的 MLxtend(Machine Learning Extensions)库是一个强大的工具,为机器学习实验提供了一系列功能强大的扩展和工具。本文将深入探讨 MLxtend 库的核心功能、用法以及如何在机器学习项目中充分发挥其优势。 目录 前言 什么是 MLx…

Kubernetes(K8S)集群部署实战

目录 一、准备工作1.1、创建3台虚拟机1.1.1、下载虚拟机管理工具1.1.2、安装虚拟机管理工具1.1.3、下载虚Centos镜像1.1.4、创建台个虚拟机1.1.5、设置虚拟机网络环境 1.2、虚拟机基础配置(3台虚拟机进行相同处理)1.2.1、配置host1.2.2、关闭防火墙1.2.3…

JavaScript 选择范围:SelectionRange

🧑‍🎓 个人主页:《爱蹦跶的大A阿》 🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 文本选择 是 web 开发中的一个常见需求,例如高亮选定文本…

java数据结构前置知识以及认识泛型

目录 什么是集合框架 容器 时间复杂度 空间复杂度 包装类 装箱 拆箱 引出泛型 泛型类的使用 类型推导 泛型如何编译的 泛型的上界 泛型方法静态泛型方法以及泛型上界 什么是集合框架 Java 集合框架 Java Collection Framework ,又被称为容器 containe…

普通男孩的新年创作纪念日

前言 首先在新春佳节,小编在这里祝各位大佬。萌新友友们新年好,希望每一个烟火般的你在新的一年里 offer 多多,薪资多多 ,龙行龘龘 🐉 🐉 🐉 🐉,前程朤朤 ❤️ ❤️ ❤…

学习天机02

1.注入bean的写法 构造函数的注入 2.回答和评论 在做这个功能的时候需要理解一些概念,张三提出问题就是提问者,李四去回答张三的问题,李四就是回答者,王五去回答李四的评论,王五就是评论者。 在提供的InteractionRep…

通俗易懂搞定forEach和map的区别和使用

前言 在前端开发的时候,我们有时候需要对后端传过来的数组的进行相应的遍历处理,但是很多小伙伴对map和forEach两个方法的界限还是有模糊,本文从具体的示例来弄清楚两者的相同点和不同点 相同点 1.都是用于遍历数组的方法,可以…

《Linux 简易速速上手小册》第1章: Linux 系统基础(2024 最新版)

文章目录 1.1 Linux 操作系统概述1.1.1 重点基础知识1.1.2 重点案例:配置 Apache Web 服务器1.1.3 拓展案例 1:配置 SSH 服务以进行远程管理1.1.4 拓展案例 2:使用 Cron 定时任务 1.2 选择合适的 Linux 发行版1.2.1 重点基础知识1.2.2 重点案…

腾讯云幻兽帕鲁服务器配置怎么选择合适?

腾讯云幻兽帕鲁服务器配置怎么选?根据玩家数量选择CPU内存配置,4到8人选择4核16G、10到20人玩家选择8核32G、2到4人选择4核8G、32人选择16核64G配置,腾讯云百科txybk.com来详细说下腾讯云幻兽帕鲁专用服务器CPU内存带宽配置选择方法&#xff…

理解JAVA命名和目录接口(JNDI)

理解JAVA命名和目录接口(JNDI) 考虑访问网站的场景,Web用户要求记住四字节的IP地址而不是有意义的名称。例如,假设Web用户用123.23.3.123而不是hotmail.com访问hotmail网站。在这种情形下,Web用户难以记住不同的IP地址来访问不同的网站。因此,要使其变得对Web用户简单方…

Vue3高频知识点和写法

一 Vue插件 二 vue3项目创建 创建完成后npm install npm run dev 三 setup 一 响应式数据 setup函数是用来代替data和methods的写法的,在setup函数中声明的数据和函数,导出后可以在页面中使用。 但是暂时不是响应式数据,如果要响应式数据的…

单片机学习笔记---AT24C02数据存储

目录 AT24C02数据存储 准备工作 代码讲解 I2C.c 模拟起始位置的时序 模拟发送一个字节的时序 模拟接收应答的时序 模拟接收一个字节的时序 模拟发送应答的时序 模拟结束位置的时序 I2C.h AT24C02.c 字节写:在WORD ADDRESS(字地址&#xff…