SpringBoot Web源码分析(五),拦截器和文件上传

层层递进的关系来分析 SpringBoot 的Web模块源码

1. SpringBoot Web源码分析(一) 静态资源源码分析

2. SpringBoot Web源码分析(二) 请求处理源码分析

3. SpringBoot Web源码分析(三) 响应处理源码分析

4. SpringBoot Web源码分析(四) 视图解析器源码分析

5. SpringBoot Web源码分析(五),拦截器和文件上传

6. SpringBoot Web源码分析(六) 异常处理和Servlet组件

7. SpringBoot Web源码分析(七) 嵌入式服务器和定制化原理

1.5 拦截器

1.5.1 拦截器基本用法

在这里插入图片描述

1. 声明一个自己的拦截器,实现 HandlerInterceptor 接口。

在这里插入图片描述

2. 将这个拦截器注册到容器中

如果我们想在 web 配置中加入我们自己的配置时,就需要创建一个配置类,实现 WebMvcConfigurer 接口,在这里面添加上我们自己额外的配置。

WebMvcConfigurer 接口
在这里插入图片描述

根据方法就能看到里面有一个 addInterceptors 方法,添加我们自定义的拦截器

最后将拦截器添加到容器中,这样这个拦截器就能生效了

在这里插入图片描述

1.5.1 拦截器源码分析

1. 根据当前请求,找到 HandlerExecutionChain

doDispatch() 中的getHandler 方法,得到处理器(可以处理请求的handler以及handler的所有拦截器)
在这里插入图片描述
在这里插入图片描述

2. 顺序执行所有拦截器的preHandler 方法
如果返回为true 则执行下一个拦截器。

在这里插入图片描述
如果返回为false则执行triggerAfterCompletion方法,倒序执行(i-- 的for循环方式)
在这里插入图片描述

3. 如果任何一个拦截器都返回 false,直接不执行目标方法
4. 所有拦截器都返回 true,执行目标方法

在这里插入图片描述

5. 执行PostHandler方法
我们点进去发现也是倒序执行(使用 i-- 的方式)

在这里插入图片描述
在这里插入图片描述

6. 异常直接触发afterCompletion

在这里插入图片描述

7. 页面渲染完成触发 afterCompletion
(第一行是页面进行渲染的方法,后面无论是否发生异常都会运行afterCompletion方法)

这里也从源码的角度证明了拦截器中 afterCompletion 方法是一定会执行的
在这里插入图片描述

拦截器总结图

在这里插入图片描述

1.6 文件上传

1.6.1 文件上传示例

1. 页面代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
</head>
<body>

    <form method="post" action="/upload" enctype="multipart/form-data">
        <label>单文件</label>
        <input type="file" name="signalFile">
        <label>多文件</label>
        <input type="file" multiple name="multipleFile">
        <input type="submit" value="提交">
    </form>
</body>
</html>
2. Controller 处理并保存到磁盘
    @PostMapping("/upload")
    public String upload(@RequestPart("signalFile") MultipartFile signalFile,
                         @RequestPart("multipleFile") MultipartFile[] multipleFile) throws IOException {
        
        signalFile.transferTo(new File("D:\\imgs\\" + signalFile.getOriginalFilename()));
        for (MultipartFile file : multipleFile) {
            file.transferTo(new File("D:\\imgs\\" + file.getOriginalFilename()));
        }
        return "file";
    }

1.6.2 文件上传原理

文件上传自动配置类-MultipartAutoConfiguration-MultipartProperties

在这里插入图片描述

  • 自动配置好了 StandardServletMultipartResolver 【标准的Servlet文件上传解析器】

  • 原理步骤

    1. 请求进来使用文件上传解析器判断(isMultipart)并封装(resolveMultipart,返回MultipartHttpServletRequest)文件上传请求

    判断是否是一个文件上传请求,如果是就返回这个请的封装类在这里插入图片描述 两个判断过程 判断multipartResolver是否为空在这里插入图片描述
    然后判断表单头部是否是包含 multipart/
    在这里插入图片描述
    如果确定是一个文件上传请求,就会调用对其进行封装的方法封装过程
    在这里插入图片描述
    调用StandardServletMultipartResolver实现的resolveMultipart方法
    在这里插入图片描述

    1. 参数解析器来解析请求中的文件内容封装成MultipartFile(详情请看参数解析器的源码分析)

    2. 将request中文件信息封装为一个Map;MultiValueMap<String, MultipartFile>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_CX_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值