Spring Web MVC入门(2)(请求2)

目录

1.传递JSON数据

传递JSON对象

2.获取URL中的参数@PathVariable

3.上传文件@RequestPart

4.获取Cookie/Session

(1)获取Cookie

简洁获取Cookie

(2)获取Session

Sesson读取

简洁获取Session(1)

简洁获取Session(2)

5.获取Header

简洁获取Header


1.传递JSON数据

JSON概念

JSON :JavaScript Object Notation(javaScript对象表示法)

JSON是一种轻量级的数据交互格式.它基于ECMAScript(欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储表示数据.

简单来说:JSON就是一种数据格式,有自己的格式和语法,使用文本表示一个对象或数组的信息,因此JSON本质是字符串,主要负责在不语言中数据传递和交换.

JSON语法

我们先来看一段JSON数据

{"squadName": "Super hero squad","homeTown": "Metro City","formed": 2016,"secretBase": "Super tower","active": true,"members": [{"name": "Molecule Man","age": 29,"secretIdentity": "Dan Jukes","powers": ["Radiation resistance", "Turning tiny", "Radiation 
blast"]}, {"name": "Madame Uppercut","age": 39,"secretIdentity": "Jane Wilson","powers": ["Million tonne punch", "Damage resistance", "Superhuman 
reflexes"]}, {"name": "Eternal Flame","age": 1000000,"secretIdentity": "Unknown","powers": ["Immortality", "Heat Immunity", "Inferno", 
"Teleportation", "Interdimensional travel"]}]}

JSON的语法:

1.数据在键值对(key/value)中

2.数据由逗号,分隔

3.对象用{}表示

5.值可以为对象,也可以为数组,数组中可以包含多个对象.

传递JSON对象

接受JSON对象,需要使用@RequestBody注解

?RequestBody:请求正文,意思是这个注解作用在请求正文的数据绑定,请求参数必须写在请求正文中

后端实现:

 @RequestMapping("/m1")public Object method1(@RequestBody Person person) {return person.toString();}

2.获取URL中的参数@PathVariable

Path Variable:路径变量

和字面表达的意思一样,这个注解主要作用在请求URL路径上的数据绑定

默认传递参数写在URL上,Spring MVC就可以获取到

后端代码实现: 

  @RequestMapping("/m2/{id}/{name}")public String method2(@PathVariable Integer id,@PathVariable("name") String userName) {return "解析参数id" + id + ",name: "+ userName;}

使用浏览器发送请求: 127.0.0.1:8080/test/m2/2/zhangsan

响应:

3.上传文件@RequestPart

后端代码实现:

 @RequestMapping("/m3")public String getfile(@RequestParam("file") MultipartFile file) throws IOException {String fileName = file.getOriginalFilename();file.transferTo(new File("D:\\javaAdvanced"+file.getOriginalFilename()));return "接收到文件名称为: " + fileName;}

使用postman发送请求:

4.获取Cookie/Session

HTTP 协议自身是属于"无状态"协议.

"无状态" 的含义指的是:  默认情况下HTTP协议的客户端和服务器之间的这次通信,和下次通信之间没有直接联系.

但实际开发中,我们很多时候是需要知道请求之间的关联关系的.

例如: 登陆网站成功后,第二次,第二次访问的时候服务器就能知道该请求是否是已经登陆过了.

上述图中的"令牌"通常就存储在Cookie字段中.

理解Session

我们先来了解一下什么是会话

会话:对话的意思

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

服务器同一时刻收到的请求是很多的.服务器需要清楚的区分每个请求时从属于哪个用户,也就是属于哪个会话,就需要在服务器这边记录每个会话以及与用户的信息的对应关系:

Session是服务器为了保存用户信息而创建的一个特殊对.

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

SessionID是由服务器生成的一个"唯一性字符串",从Session机制的角度来看,这个唯一性字符串称为"Session".但是站在整个登录流程中看待,也可以把这个唯一性字符串称为"token"

1.当用户登录的时候,服务器在Session中新增一个新记录,并把sessionID返回给客户端(通过HTTP响应中的Set-Cookie字段返回).

2.客户端后续再给服务器发送请求的时候,需要再请求中带上sessionID.(通过HTTP请求中的Cookie字段带上).

3.服务器收到请求之后,根据请求中的sessionID在Session信息中获取到对应的用户信息,再进行后续操作,找不到则重新创建Session,并把SessionID返回.

Session默认是保存在内存中的.如果重启服务器则Session数据就会丢失.

Cookie和Session的区别(面试题)

1.Cookie是客户端保存用户信息的一种机制.Session是服务器保存用户信息的一种机制.

2.Cookie和Session之间主要是通过SessionID关联起来的,SessionID是Cookie和Session之间的桥梁.

3.Cookie和Session经常会在一起配合使用.但是不是必须配合.

   1)完全可以用Cookie来baocun一些数据在客户端.这些数据不一定是用户身份信息,也不一定是SessionID

   2)Session中的sessionID也不需要非得通过Cookie/Set-Cookie传递,不如通过URL传递.

(1)获取Cookie

传统获取Cookie

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

Spring MVC是基于Servlet API构建的原始Web框架,也是在Servlet的基础上实现的

HttpServletRequest , HttpServletResponse 是 Servlet提供的两个类,是Spring MVC方法的内置对象.需要时直接在方法中添加声明即可.

HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供方法,可以获得客户端请求的所有信息.

HttpServletResponse对象代表服务器的响应.HTTP响应的信息都在这个对象中,比如向客户端发送的数据,响应头,状态码等.通过这个对象提供的方法.可以获得服务器响应的所有内容

Spring MVC在这两个对象的基础上进行了封装,给我们提供了更加简单的使用方法.

此时没有设置cookie,通过浏览器访问:http://127.0.0.1:8080/test/m1,得到Cookie为null

我们设置一下Cookie的值

再次访问:

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

简洁获取Cookie

  @RequestMapping("/getCookie")public String cookie(@CookieValue("xg") String xg) {return "xg" + xg;}

运行结果:  127.0.0.1:8080/test/getCookie

(2)获取Session

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

Session也是基于HttpServletRequest来存储和获取的

Session存储

@RequestMapping("/setSess")public String setsess(HttpServletRequest request) {//获取Session对象HttpSession session = request.getSession();if(session != null) {session.setAttribute("userName","java");}return "session存储成功";}

这个代码中看不到SessionID这样的概念的.getSession操作内部提取到请求中的Cookie里的SessionID,然后根据SessionID获取到对应的Session对象,Session对象用HttpSession来描述

获取Session有两种方式

HttpSession getSesson(boolean create)
HttpSession getSession();

HttpSession getSession(boolean create) : 参数如果为true,则当不存在会话时新建会话;参数如果为false,则当不存在会话时返回null.

HttpSession getSession() : 和 getSession(true) 含义一样,默认值为true.

void setAttribute(String name,Object value) : 使用指定的名称绑定一个对象到该session会话

Sesson读取

读取Session可以使用HttpServletRequest

   @RequestMapping("/getSess")public String sess(HttpServletRequest request ) {//如果session不存在,不会自动创建HttpSession session = request.getSession(false);String userName = null;if(session != null && session.getAttribute("userName") != null) {userName = (String) session.getAttribute("userName");}return "userName: " + userName;}

Object Attribute(String name) : 返回在该session会话中具有指定名称的对象,如果没有指定名称的对象,则返回null.

运行

先设置Session: http://127.0.0.1:8080/test/setSess

获取Session: http://127.0.0.1:8080/test/getSess

简洁获取Session(1)

    @RequestMapping("/getSess2")public String sess2(@SessionAttribute(value = "userName",required = false) String userName) {return "userName" + userName;}

运行: http://127.0.0.1:8080/test/getSess2

简洁获取Session(2)

通过Spring MVC内置对象HttpSession来获取

    @RequestMapping("/getSess3")public String sess3(HttpSession session) {String userName = (String) session.getAttribute("userName");return "userName: " + userName;}

运行: http://127.0.0.1:8080/test/getSess3

Session不存在的话,会自动进行创建

5.获取Header

传统获取Header

获取header也是从HttpServletRequest中获取

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

使用getHeader方法来获取

运行: http://127.0.0.1:8080/test/getHeader

简洁获取Header

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

运行: http://127.0.0.1:8080/test/getHeader2

@RequesetHeader注解的参数值为HTTP请求报头中的"Key"

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

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

相关文章

大模型计算及GPU相关概念记录

浮点运算 算力最基本的计量单位是 FLOPS,英文 Floating-point Operations Per Second,即每秒执行的浮点运算次数。浮点运算其实就是带小数的加减乘除运算。 算力的计量单位,除了 FLOPS,从小到大还有: KFLOPS&#x…

新建一个git仓库并且把已有项目推送到git远程仓库

总贴 1. 创建一个空项目,不会看新建仓库 2. 克隆这个项目到某个文件夹去,比如我想克隆到我的E盘的code下面 3. 我的这个文件夹下面是有东西的,一点都不影响 . 4. 用命令行进入这个文件夹 命令行已经显示了已经在E盘下面code文件夹, 不会…

【TortoiseGitPlink提示输入密码解决方法】

问题:TortoiseGitPlink提示输入密码 解决方案 参考链接:TortoiseGitPlink提示输入密码解决方法 但后半部分和上文不同,点击图中 Load Putty Key 即可。

CrowdStrike更新导致蓝屏事件

1. 事件描述 网络上发现大量企业Windows系统主机出现BSOD(Bluescreen of Death)并循环重启。 观察蓝屏信息,发现造成蓝屏的程序均是csagent.sys,该程序为CrowdStrike终端安全软件组件。 经确认,CrowdStrike是造成本…

第5章 单片机的中断系统

5.1 中断的概念 5.2 中断控制系统 5.3 中断处理过程 5.4 中断的编程及应用举例 5.1 中断的概念 日常生活的中断现象举例 中断是指在突发事件到来时先中止当前正在进行的工作,转而去处理突发事件。待处理完成后,再返回到原先被中止的工作处&#xff…

【STM32】LED闪烁LED流水灯蜂鸣器(江科大)

LED正极:外部长脚、内部较小 LED负极:外部短脚、内部较大 LED电路 限流电阻:保护LED,调节LED亮度(本实验用面包板为了方便,省去了限流电阻,设计电路时要加上) 左上图:低…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第三十六章 Linux驱动初探

i.MX8MM处理器采用了先进的14LPCFinFET工艺,提供更快的速度和更高的电源效率;四核Cortex-A53,单核Cortex-M4,多达五个内核 ,主频高达1.8GHz,2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

阿尔泰科技工业电脑IPC-8363工控机

概述: IPC-8363是一款支持 LGA 1200 Intel 10th/11th Generation Core™ i9/i7/i5/i3, Celeron and Pentium processor 的工业电脑。配置2组独立 SO-DIMM DDR4 2666/2933MHz内存,最大可扩展至128GB。 主要技术指标: 产品图示: 系…

Codeforces Round 672 (Div. 2) C1. Pokémon Army (easy version) (DP)

不知道能不能用贪心,反正我是没看出来,所以用DP求解。 首先分析一下题意,我们要在一段序列中取出一段子序列,然后让这段子序列按顺序逐个先加后减最终得到的结果最大。 如果要用DP,那么我们首先就要思考怎么表示状态…

Apache SeaTunnel——OLAP 引擎的数据动脉

导读本文将分享如何利用 Apache SeaTunnel 将各个业务系统的数据同步到 OLAP 引擎。 主要内容包括以下六大部分: 1. Apache SeaTunnel 项目介绍 2. Apache SeaTunnel 核心功能 3.SeaTunnel 在 OLAP 场景下的应用 4. 社区近期计划 5. WhaleTunnel 产品特性 6. …

idea怎么配置gradle多个版本

1.背景 gradle版本很多,而且很多时候版本是不兼容的,我们希望拉取下来的代码就包含已经配置好的版本,而不是去配置本机的gradle版本..... 意思就是要实现项目A可以用6.X版本 项目B可以使用7.X版本 项目C可以用9.X版本..... 2.配置方式 步骤一:项目根路径下保留一个文件夹…

MySQL事务管理详解:特性、问题与解决方案

什么是事务? 事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。事务是逻辑上的一组操作,要么都执行,要么都不执行。 事务的四大特…

Docker搭建Harbor

1.什么是Harbor Harbor 是 vMware 公司开源的企业级 Docker 〖egistry 项日,其日标是帮助用户迅速搭建一个企业级的 Docker Registry 服务。Harbor以 Docker 公司开源的 Registry 为基础,提供了图形管理UI 、基于角色的访问控制(Role Based Accesscontr…

活动回顾 | AutoMQ 联合 GreptimeDB 共同探讨新能源汽车数据基础设施

7 月 13 日,AutoMQ 携手 GreptimeDB“新能源汽车数据基础设施” 主题 meetup 在上海圆满落幕。本次论坛多角度探讨如何通过创新的数据管理和存储架构,提升汽车系统的性能、安全性和可靠性,从而驱动行业的持续发展和创新,涵盖 Auto…

PHP萌宠之家微信小程序系统源码

🐾萌宠之家微信小程序🐾 —— 铲屎官们的温馨小窝✨ 🏠【一键开启萌宠乐园】🏠 亲们,是不是每次刷手机都忍不住想看看那些软萌可爱的毛孩子?现在,有了“萌宠之家”微信小程序,你的…

LeetCode 3112.访问消失节点的最少时间:单源最短路的Dijkstra算法

【LetMeFly】3112.访问消失节点的最少时间:单源最短路的Dijkstra算法 力扣题目链接:https://leetcode.cn/problems/minimum-time-to-visit-disappearing-nodes/ 给你一个二维数组 edges 表示一个 n 个点的无向图,其中 edges[i] [ui, vi, l…

【深度学习】【Lora训练4】StabelDiffusion,人物lora训练

启动: docker run -it --gpus all --net host -v /ssd/xiedong/xiezhenceshi/lora_train:/ssd/xiedong/xiezhenceshi/lora_train kevinchina/deeplearning:pytorch2.3.0-cuda12.1-cudnn8-devel-xformers-lora-train bashrootgpu16:/workspace/lora-scripts# python…

6. JavaSE ——【深入理解Java中的按位运算符】

💻 开场白 欢迎来到我的技术博客!在这里,我们将一起探索编程的奥秘,分享代码的智慧,让技术改变生活。让我们开始这段精彩的旅程吧!🚀💻🌐 📖个人主页&#xf…

untiy 竖排文字

使用的tmp文本&#xff0c;启用富文本&#xff0c;默认就是启用的 然后在要竖排的文本前边拼接 效果如下 如果用代码拼接 text.text "<rotate90>""内容";

深入Redis集群部署:从安装配置到测试验证的完整指南

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f427;Linux基础知识(初学)&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01; &#x1f510;Linux中firewalld防火墙&#xff1a;点击&#xff01; ⏰️创作…