SpringBoot原理理解拦截器和文件上下传(总体第五篇)

之前呢已经学习到了SpringBoot的一些自动配置原理,视图解析器,数据响应和处理的内容。接下来学习实际开发比较重要的内容,拦截器

一、拦截器

1、如何实现拦截器

原生自带的是用实现HandlerInterceptor接口来实现拦截功能,但是后续呢,基本都是采用SpringSecurity来完成登录拦截验证。

(1)实现接口HandlerInterceptor


/**
 * 登录检查
 */
public class MyInterceptor implements HandlerInterceptor {

    /**
     * 目标方法执行之前
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return false;
    }


    /**
     * 目标方法执行
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    /**
     * 目标方法执行之后
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }


}

(2)实现登录拦截

  • 登录检查
    • 配置好拦截器要拦截哪些要求
    • 把这些配置放在容器中
public class MyInterceptor implements HandlerInterceptor {

    /**
     * 目标方法执行之前
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return false;
    }


    /**
     * 目标方法执行
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    /**
     * 目标方法执行之后
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }


}

在这里插入图片描述

  • 此时启动测试
    在这里插入图片描述
    就没有了我们的CSS和HTML样式了,所以我们的拦截器可以初步判断成功了。

  • 放行css等样式看看
    在这里插入图片描述

(3)使用拦截的步骤

public class MyInterceptor implements HandlerInterceptor {

    /**
     * 目标方法执行之前
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //我们在拦截之前要完成的逻辑
        return false;
    }


    /**
     * 目标方法执行
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

        //我们可以在这里面的自己的业务逻辑
    }

    /**
     * 目标方法执行之后
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

        //拦截之后,你想要操作的逻辑
    }


}

  • 创建自己的拦截器
  • 然后注入容器
  • 配置拦截规则(如果拦截的是/**,记得它拦截的是所有,包括你的静态资源)

2、源码分析拦截的原理

(1)模拟拦截过程

  • 配置一个controller并且不放行
    在这里插入图片描述

在这里插入图片描述

(2)打断点

  • 断点打在这里
    在这里插入图片描述

  • 经过这一步获得了我们的可以处理请求的Handler以及Handler的所有拦截器
    在这里插入图片描述
    在这里插入图片描述

  • 进入这里看看
    在这里插入图片描述

  • 在这里顺序执行拦截器的preHandler方法(就会返回true)
    在这里插入图片描述

    • 返回true后,则执行下一个拦截器的preHandler
    • 返回为false后,直接触发triggerAfterCompletion(倒叙执行所有已经执行了的拦截器的afterCompletion,所以为什么:当你有个拦截器的时候,你的afterCompletion就会反过来执行)
      在这里插入图片描述
  • 如果任何一个拦截器执行失败返回false直接跳出不自信目标方法

  • 最后所有的拦截器都会返回true。
    在这里插入图片描述

  • 倒叙执行所有拦截器的postHandler方法
    在这里插入图片描述
    在这里插入图片描述

  • 前面的所有步骤,有任何的异常,都会直接触发,afterCompletion方法(比如下面的第二个烂机器爆炸了)
    在这里插入图片描述

  • 页面成功渲染完成后,也会倒叙触发我们的triggerAfterCompletion方法
    在这里插入图片描述

二、文件上下传

(一)文件上传

1、编写前端html和Controller

  • html
    在这里插入图片描述
<form method="POST" action="/uploadFile" enctype="multipart/form-data">
    <input type="file" id="file_input"name="file" /><br/><br/>
    <input type="submit"  value="Submit" />
</form>
  • 可以如下方式写(这里就只是模拟单文件)
    在这里插入图片描述

  • controller
    在这里插入图片描述

2、实现上传

  • 先测试一下行不行
    在这里插入图片描述
  • 获取数据

多文件就这样写
在这里插入图片描述

  • 启动测试
    在这里插入图片描述
    在这里插入图片描述

3、服务器如何保存文件呢

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

  • 测试发现什么都没有
    在这里插入图片描述
  • 检测路径
    在这里插入图片描述
  • 换个试一试
    在这里插入图片描述
    在这里插入图片描述
  • 同样的如果多文件就这样写
    在这里插入图片描述

4、可以这样修改文件上下传的参数

在这里插入图片描述

(二)文件上传的原理

1、看原代码

在这里插入图片描述
文件上传自动配置类MultipartAutoConfiguration(里面有MultipartProperties)

  • 自动配置了文件上传解析器(StandardServletMultipartResolver):文件上传解析器

2、打断点来理解原理

  • 首先请求不管怎么样都是分析我们的DispatcherServlet类里面的doDispatch方法里面进行分析

  • 首先来到了这一步
    在这里插入图片描述
    选择(进入这个放啊)

  • 这里就要判断请求是否使用文件上传解析器。
    在这里插入图片描述
    在这里插入图片描述

  • 然后要在这里进行判断(封装为一个StandardMultipartHttpServletRequest)
    在这里插入图片描述

  • 我们的参数解析器解析请求中的文件类型MultipartFile
    在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值