深度解析源码之SpringMVC文件上传为什么要用POST请求还要设置请求头

news2024/11/24 14:02:13

深度解析源码之SpringMVC文件上传为什么要用POST请求还要设置请求头

从本篇文章开始,来逐步介绍里面每一步的细节处理流程。
首先看到doDispatch方法的第一个重要操作就是校验文件上传请求。代码如下:
在这里插入图片描述
这个方法是如何校验文件上传请求的呢? 在看这个方法之前,我们先来回忆回忆,之前在写文件上传前端代码的时候,有两个约定俗成的原则:

  • 请求方式要是POST类型的
  • 要设置enctype属性为"multipart/form-data"类型

我们带着这两个约定的原则来看看SpringMVC中是如何来判断文件上传请求的,打开checkMultipart方法的代码,核心代码如下:
在这里插入图片描述
在上面代码第2行这有个判断,调用了multipartResolver的isMultipart方法,这个对象我们在之前介绍Spring九大组件时提到过,它是SpringMVC九大组件中的其中一个,在SpringMVC九大组件初始化的时候,会从容器中去获取这个组件,如下:
在这里插入图片描述
如果我们在Spring容器中没有装配这个类型的Bean,那么应用就没办法支持SpringMVC的文件上传。 我们继续看上面的multipartResolver的isMultipart是干嘛用的呢?

先来看看官方的解释:
在这里插入图片描述
这个方法就是来看看request请求中的content-type是否为"multipart/form-data"类型的。也就是我们在form表单中设置的enctype属性。下面来看看这个方法的实现。

MultipartResolver本身是SpringMVC提供的一个文件上传的标准化接口,我们可以基于这个接口来实现自己的文件上传逻辑,但是在SpringMVC中,对这个接口提供了一个默认的实现,在spring-web这个模块中,对应的实现类的类名是CommonsMultipartResolver,我们来看看这个实现类里面的逻辑:

在这里插入图片描述

里面直接调用了commons-fileupload组件的isMultipartContent方法,这个方法是apache提供的一个文件上传组件,对应的实现如下:

在这里插入图片描述
我们看到,在66行,第一个判断逻辑是判断是否为POST请求,所以验证了之前我们提到的文件上传第一个原则,要是POST类型的请求。

如果是POST请求,将会再去调用isMultipartContent方法,校验HTTP请求头信息中的Context-Type属性,如下:

在这里插入图片描述
在这里插入图片描述
我们看到上面的if判断中,只是校验了Content-Type是否是"multipart/“开头的,但是并不是一定要是"multipart/form-data”,那就只有一种可能,就是还有其他类型的Content-Type可以支持文件上传了。

那么判断它是文件上传请求之后呢?

那当然是要解析文件上传请求了,也就是下面代码中的红框部分了
在这里插入图片描述
这个方法里面就是将普通的HttpServletRequest中的文件信息进行解析,然后封装为MultipartHttpServletRequest对象,代码如下:

在这里插入图片描述
默认不会走延迟解析这种方式,直接解析request请求,在这个parseRequest方法中就是一系列commons-fileupload组件的操作了,如下:

在这里插入图片描述
这个parseRequest方法再往里,就是从请求中读取文件输入流,然后封装到MultipartParsingResult中,最后再把MultipartParsingResult包装为一个文件请求对象返回。commons-fileupload中的操作,有兴趣可以留言我们再展开聊。

这一切准备就绪之后,就回到我们最开始的doDispatch方法中了,如下
在这里插入图片描述

如果返回的请求和原始请求不一样,就表示解析到了文件,再下面的步骤就会进行文件的写文件操作。

对于文件请求的判断我们就介绍到这,可以自己结合代码捋一捋。文章结尾我们再来聊一个问题:

文件上传为什么一定得是POST请求方式,Content-Type为什么一定得是"multipart/form-data"等方式?

请求用GET还是POST,就得看他们有什么区别,我们都知道,最大的一个区别就是GET请求能传输的数据一次性最多只能到1024字节,而POST请求则没有限制,所以一般传文件,请求数据肯定都相对比较大,就得用POST请求。

为什么Context-Type这个请求头就一定得是"multipart/form-data",这个没有为什么,就是"RFC1867"协议中定义的一个文件上传标准。也就是"互联网工程任务组"定义的一些标准属性,属于一些底层协议层面的标准,那么你上层应用想要用这种功能,就必须要遵守人家定义的这个标准。

码字实属不易,如果有收获,请动动手指,点个赞和关注鼓励一下呗!

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

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

相关文章

软件测试最常用的 SQL 命令 | 通过实例掌握基本查询、条件查询、聚合查询

本文为霍格沃兹测试学院优秀学员学习笔记,汇总了软件测试人员经常使用,必须掌握的 SQL 基础命令1、DML核心CRUD增删改查缩写全称和对应 SQL:* DML 数据操纵语言:Data Manipulation Language* Create 增加:insert* Ret…

工作和学习遇到的技术问题

写在前面 记录工作和学习遇到的技术问题,以求再次遇到可以快速解决。 1:Ubuntu TSL换源报错:Err:1 http://mirrors.aliyun.com/ubuntu focal InRelease 执行如下操作(已经操作的则忽略),首先在文件/etc/apt/sources…

Vue.js 数据双向绑定的实现

前言 在我们使用vue的时候,当数据发生了改变,界面也会跟着更新,但这并不是理所当然的,我们修改数据的时候vue是如何监听数据的改变以及当数据发生改变的时候vue如何让界面刷新的? 当我们修改数据的时候vue是通过es5中…

DataGear 制作基于Vue2、Element UI弹窗效果的数据可视化看板

DataGear 在4.4.0版本新增了dg-chart-manual-render特性,用于手动控制看板内图表的渲染,而非在页面加载时自动渲染。利用这一特性,可以很方便制作具有弹窗效果的数据可视化看板。 本文以Vue2、Element UI 前端框架为例,介绍如何制…

【C语言】通讯录—静态版

前言: 刚学完结构体和枚举,在网上找了个通讯录的项目,用来练手 目标:该通讯录可存储千人个人信息 包括:姓名,年龄,性别,电话,地址 实现功能: 1.添加联系人 2.删除联系人 …

Web 安全漏洞之 XSS 攻击

什么是 XSS 攻击 XSS(Cross-Site Scripting)又称跨站脚本,XSS的重点不在于跨站点,而是在于脚本的执行。XSS是一种经常出现在 Web 应用程序中的计算机安全漏洞,是由于 Web 应用程序对用户的输入过滤不足而产生的。 常…

MyBatis -- 多表查询

MyBatis -- 多表查询一、准备工作二、多表查询属性名与字段名不匹配一、准备工作 博客系统场景。 创建库、表: -- 创建数据库 drop database if exists mycnblog; create database mycnblog DEFAULT CHARACTER SET utf8mb4;-- 使用数据数据 use mycnblog;-- 创建…

小程序样式和组件基础

小程序样式和组件基础小程序样式样式wxss简介响应式单位rpx其它css单位支持的单位内置组件简介image组件-基础组件介绍常用属性示例image组件-懒加载与基础库版本用法swiper组件组件介绍常用属性示例navigator组件-基础组件介绍常用属性示例navigator组件-页面栈页面栈返回按钮…

常用windows自带程序对应的命令

敲winr键,调出 运行 框; 输入命令回车,打开对应程序; 输入cmd,调出命令行窗口; gpedit,组策略编辑器, 有的电脑没有组策略编辑器; 资源管理器; dvdplay&…

【BP靶场portswigger-客户端15】基于DOM的漏洞-7个实验(全)

前言: 介绍: 博主:网络安全领域狂热爱好者(承诺在CSDN永久无偿分享文章)。 殊荣:CSDN网络安全领域优质创作者,2022年双十一业务安全保卫战-某厂第一名,某厂特邀数字业务安全研究员&…

使用PyTorch构建GAN生成对抗网络源码(详细步骤讲解+注释版)02 人脸识别 上

文章目录1 数据集描述2 GPU设置3 设置Dataset类4 设置辨别器类5 辅助函数与辅助类1 数据集描述 此项目使用的是著名的celebA(CelebFaces Attribute)数据集。其包含10,177个名人身份的202,599张人脸图片,每张图片都做好了特征标记&#xff0c…

【数据结构】顺序表的原理及实现

1.什么是顺序表 顺序表是用一段物理地址连续的存储单元进行存储元素的线性结构,通常是以数组进行存储。通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系。 2.顺序表的实现 判断顺序表是否为空表public boolean isEmpty()判断顺序表是否满publi…

复旦MBA海外短期课程 | 善用ESG金融,共创可持续未来

2022年,世界在颠簸中向前迈进:全球气候变化、能源危机、大国博弈……在这样的背景下,近年来备受瞩目的ESG价值、“双碳”目标、可持续发展、责任投资等话题愈发成为焦点。今年复旦MBA培养体系全面升级之际,在新增的“未来发展模块…

Pandas CSV 文件

Pandas CSV 文件CSV(Comma-Separated Values,逗号分隔值,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。CSV 是一种通用的、相对…

【沐风老师】3dMax一键生成中央空调排风口插件使用教程

3dMax一键创建中央空调排风口插件,快捷生成矩形或菱形两种形状的排风口。 【版本要求】 不确定。3dmax2020环境测试可用,其他版本自行测试,欢迎反馈测试结果。 【安装方法】 方法一:拖动插件文件到3dMax窗口打开。 方法二&#x…

ESP32相关知识点

1.vs code代码回退到上一步: 方法1:在Windows中可以使用快捷键“Alt←”实现 方法2:利用vs code界面操作,Go-Back 2.设置vs code下ESP-IDF Monitor Device的波特率。 步骤Manage-New Code update available------Command Palette 弹出对话框 搜索或选择:ESP-IDF:SD…

基于Androidstudio的打车拼车app

需求信息: 客户端: 1:注册和登录:用户信息录入与登录。 2:修改密码:用户忘记密码可在此处找回。 3:地图功能:提供城市地图,能被自由移动、放大和缩小。 4:自身定位:获取用户位置信息&#xff0c…

STM-PWM采集

输入捕获分为两种方式进行捕获 1、pwm输入捕获:精度高,每个定时器只能采集一个pwm,且只能使用通道1、通道2。 2、通用输入捕获:相对比较精确,每个定时器可以采集多个pwm, 1、pwm输入捕获使用教程如下: 参…

Vue 快速入门(一)

1、介绍 Vue(读音/vju/,类似view),是中国的大神尤雨溪开发的,为数不多的国人开发的世界顶级开源软件。是一套用于构建用户界面的渐进式框架,Vue 被设计为可以自底向上逐层应用。MVVM响应式编程模型,避免直接操作DOM&am…

虹科分享 | HPC调度解决方案:HK-Adaptive在数字卫星图像领域的应用

2011年3月11日,日本海岸附近发生了9.0级地震。这次地震引发了强大的海啸,并向内陆传播了6英里,不仅使地球的轴心偏移了大约10到25厘米,还导致福岛核电站发生核紧急情况。 为了减少这场灾害的损失,不同国家的不同组织以…