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

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

之前呢已经学习到了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


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

  • controller

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

多文件就这样写

  • 启动测试

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


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

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

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


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

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

  • 首先来到了这一步

    选择(进入这个放啊)

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

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

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/788758.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-05
下一篇 2022-05-05

发表评论

登录后才能评论

评论列表(0条)

保存