栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

一、拦截器 1、如何实现拦截器

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

(1)实现接口HandlerInterceptor

public class MyInterceptor implements HandlerInterceptor {

    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return false;
    }


    
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }


}

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

    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return false;
    }


    
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) 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 {

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


    
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) 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


  • 可以如下方式写(这里就只是模拟单文件)

  • controller

2、实现上传
  • 先测试一下行不行
  • 获取数据

多文件就这样写

  • 启动测试

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


  • 测试发现什么都没有
  • 检测路径
  • 换个试一试

  • 同样的如果多文件就这样写
4、可以这样修改文件上下传的参数

(二)文件上传的原理 1、看原代码


文件上传自动配置类MultipartAutoConfiguration(里面有MultipartProperties)

  • 自动配置了文件上传解析器(StandardServletMultipartResolver):文件上传解析器
2、打断点来理解原理
  • 首先请求不管怎么样都是分析我们的DispatcherServlet类里面的doDispatch方法里面进行分析

  • 首先来到了这一步

    选择(进入这个放啊)

  • 这里就要判断请求是否使用文件上传解析器。

  • 然后要在这里进行判断(封装为一个StandardMultipartHttpServletRequest)

  • 我们的参数解析器解析请求中的文件类型MultipartFile

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/844794.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号