springboot10:web开发常用功能(拦截器,文件上传,异常处理)

news2025/2/24 12:33:01

一.拦截器

1.使用

  • 访问任何请求,都只有登录才能访问,挨个写入请求太困难,使用拦截器机制handlerIntercepter(prehandle方法,posthandle方法,afterCompletion方法)
  • 编写一个拦截器实现handlerInterceptor接口
  • 编写的拦截器注册到容器中(实现webMvcConfigure的addInterceptors方法)
  • 指定拦截规则(如果是拦截所有,静态资源也会被拦截)
registry.addInterceptor(new LoginInterceptor())
                .addPathPatterns("/**")//所有请求,包括静态资源也会拦截
                .excludePathPatterns("/","/login","/css/**","/fonts/**","/images/**","/js/**");//放行的请求

2.拦截器原理

  • 根据当前请求找到一个具体的handler执行,并且找到handler的所有拦截器,即handlerExecution
  • 找到了handler适配器后
  • 执行目标方法之前执行了 所有handler的prehandle方法
    • 对所有的拦截器执行for循环顺序执行所有拦截器调用prehandle方法
      • 如果当前拦截器prehandle返回true,放行,执行下一个拦截器的prehandle
      • 如果当前拦截器返回为false,直接倒序执行所有已经执行了的拦截器的afterCompletion
  • 如果任何一个拦截器执行失败返回false,直接跳出不执行目标方法
  • (所有拦截器都返回true)执行目标方法
  • 执行目标方法后执行所有的倒序posthandler方法
  • 前边步骤有任何异常,都直接触发拦截器aftercompletion方法
  • 页面渲染逻辑中
    • 页面成功渲染完成之后
    • 倒序触发所有拦截器的aftercompletion
      在这里插入图片描述

二.文件上传

1.文件上传使用

  • 使用multipart
 @PostMapping("/upload")
    public String upload(@RequestParam("email") String email,
                         @RequestParam("username") String username,
                         @RequestPart("headerImg") MultipartFile headerImg,
                         @RequestPart("photos") MultipartFile[] photos) throws IOException {

        if(!headerImg.isEmpty()){
            //保存到磁盘上
            String originalFilename = headerImg.getOriginalFilename();
            headerImg.transferTo(new File("E:\\"+originalFilename));
        }
        if(photos.length>0){
            for(MultipartFile photo:photos){
                if(!photo.isEmpty()){
                    String originalFilename = photo.getOriginalFilename();
                    photo.transferTo(new File("E:\\"+originalFilename));
                }
            }
        }
        return "main";
    }

2.文件上传源码解析

  • 自动配置好了standardServletMultipartResolver(文件上传解析器)
  • 请求进来使用文件上传解析器判断并封装上传请求
    • 判断请求是否为文件上传请求(判断表单的内容类型是否为multipart/)
    • 判断是文件上传请求并封装
  • 将request封装为multipartHttpServletRequest
  • 找到handler来处理请求,执行具体的handler来执行
    • 利用参数解析器解析文件上传(@RequestPart(“headerImg”) MultipartFile headerImg,)
    • 找到参数解析器RequestPartMethod来将请求中的文件内容封装为MultipartFile

三.异常处理

1.springboot处理错误

  • 默认情况下,springboot提供/error处理所有错误的映射
  • 对于机器客户端,产生json
  • 对于浏览器客户端,产生错误页
    都有 时间戳,都有状态码

2.自定义错误页面

  • 默认规则:放在error下的4xx 和5xx

3.错误处理(自动配置)原理

①容器中配置

  • 有配置类errorMVCAutoConfiguration 自动配置异常处理规则
    • 给容器中放置了 DefaultErrorAttribute类型的组件 id:errorAttributes,定义错误页面可以包含的信息
    • 给容器中放置了 BasicErrorController类型的组件 id:basicErrorController(处理默认/error路径的请求;页面响应一个modelAndView(error))
    • 容器中有View组件,id:error(容器中有一个视图解析器(响应默认错误页)BeanNameViewResolver,按照返回的视图名error作为组件的id去找view对象)
    • 容器中中放置了DefaultErrorViewResolver,id=…,如果发生错误,会以HTTP状态码作为视图页地址(404,5xx)找到真正的页面 error/404,5xx.html
  • 如果想要返回页面,就会找error视图(staticView)。(默认是一个白页)
  • 上面的controller组件中的两个方法(responseEntity写出去json数据,errorHtml写出去一个视图 适配响应)

②整体流程(异常处理)

  • 找到适配器执行目标方法时(目标方法运行期间,有任何异常都会被catch,而且标志当前请求结束,并且用dispacthException进行封装)
  • 进入视图解析流程(页面渲染?)传参
    (request,response,handler,mv,dispatchException)
  • 处理handler异常最后返回一个mv
    • 遍历handlerExceptionResolvers处理器异常解析器看谁能处理当前异常
      • DefaultErrorAttribute…给请求域中保存了异常信息并且返回空(必须返回不为空才结束)
      • (继续解析) 三个异常解析器的组合(第一个异常解析器不满足其要求,第二个异常解析器不满足其要求,第三个异常解析器不满足要求)
      • 默认没有任何解析器能处理异常,异常被抛出
    • 如果没有任何解析器处理异常,最终底层会发送(转发)/error请求
  • 接下来 BasicErrorController来处理/error请求
  • 此时是浏览器发送,此时其中方法处理/error
    • 此时会解析错误视图,遍历所有的ErrorViewResolver错误视图解析器看谁能处理错误视图
      • DefaultErrorViewResolver把响应的状态码500拿到作为错误页的地址拼接/error/500,然后通过模板引擎判断有没有/error/500页面,如果有直接返回页面带.html页面

4.定制错误处理逻辑

  • 自定义错误页 放在error下的4xx 和5xx(400错误无法解决)精确匹配
  • 利用@ControllerAdvice + @ExceptionHandler处理异常
    • @ControllerAdvice该类为处理异常类 @ExceptionHandler({ArithmeticException.class,NullPointerException.class})为该方法能处理的异常类型
    • 原理?
    • 在三个异常解析器的组合中第一个异常解析器ExceptionHandlerExceptionResolver能够处理(第一个异常处理器判断是否有标志@ExceptionHandler的方法,如果有标志,就调用该方法进行处理)
    • return 字符串(放到了modelAndView) 等于正常的方法
  • 抛出自己定义的异常
    @ResponseStatus()可以在自定义异常类声明一个错误状态码(也可以被解析)
    • 原理?
    • 在三个异常解析器的组合中第二个异常解析器ResponseStatusExceptionResolver能够处理(第二个异常处理器判断当前异常是否有@ResponseStatus注解,如果有,就调用该方法进行处理)
    • 将注解的状态码解析出来,然后直接跳去错误页 response.sendError();tomcat发送的/error,然后进入处理error逻辑
  • 底层异常(参数不存在)框架抛出异常
    • 在三个异常解析器的组合中第三个异常解析器DefaultHandlerExceptionResolver能够处理(第三个异常处理器判断当前异常是否是springmvc底层的异常,如果是,就调用该方法进行处理)
    • 然后sendError(执行方法立即结束,tomcat抛出一个/Error(包含状态码),看谁能处理)
    • 正常直接返回tomcat的错误页,但是sprignmvc底层有servlet专门处理/error请求

5.自定义异常解析器

  • 直接定义返回值modelandView不让其他异常解析器解析,并且response.sendError(511,“错误”) 即tomcat发送 /error
  • @order 让其排在第一位
  • @component成为bean
  • 实现handlerExceptionResolver异常解析器

6.ErrorViewResolver实现自定义处理异常

  • response.sendError error请求就回转给controller
  • 异常没人处理,也会直接senderror(modelandview都是null)
  • 要去的页面地址是ErrorViewResolver解析的,去/error/xxx.html页面

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

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

相关文章

算法与数据结构 - 字节跳动笔试题

😄这里将持续更新接下来做过的字节跳动公司相关的笔试题,包括网上收集的秋春招笔试题、以及自己参加的字节举办的编程赛的题目。 🚀导航: ID题目描述NO.1小红走迷宫简单、按逻辑写即可ACNO.2铺水管dfs回溯、注意剪枝才能ACNO.3喵汪故事借助二分才能ACNO.4小超的游戏pytho…

学术论文写作以及discussions/results与conclusion的区别

经验帖 | 如何写SCI论文? Result、Discussion和Conclusion区别解析 如何写学术论文 一篇论文只能有一个主题,不能出现过多的研究问题,这样只会让文章读起来很乱。就像大牛经常讲的,“one paper, one story”,一篇论文…

unix/linux make

GNU:make 参考文档 程序的编译和链接 一般来说,无论是C还是C,首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即Object File,这个动作叫做编译(compile&…

HummerRisk V0.5.1 发布:新增对象存储、优化K8s 资源态势和资源拓扑等

HummerRisk V0.5.1 发布:新增对象存储对接查看功能,增加 K8s 资源的部署信息查看,深度优化K8s 资源拓扑,并优化了镜像检测、云检测及资源态势同步等多个内容。 感谢社区中小伙伴们的反馈,你们的认可是我们前进的动力。…

java中的函数式接口是什么?

问题现象: 最近在复习java基础知识,发现了一个面试题: java中的函数式接口是什么? 问题分析: 老实说,我一开始看到“函数式接口”这个术语,愣了一下: java中的函数式接口是什么&…

移动WEB开发之流式布局--二倍图

物理像素&物理像素比 物理像素点指的是屏幕显示的最小颗粒,是物理真实存在的。这是厂商在出厂时就设置好了,比如苹果6\7\8 是 750* 1334 物理像素比就是屏幕的分辨率,分辨率越高,显示越清楚,750* 1334就是横的有750的像素点…

运行mbedtls自带Demo ssl_client的记录

概述: 运行mbedtls自带 ssl demo的记录; 操作过程: 编译Demo,请看我专栏中的相关文章 先运行服务端程序,运行ssl_server.exe,运行结果如下: mbedtls-3.2.1\mbedtls-3.2.1\programs\ssl> .…

目标检测论文解读复现之九:基于改进YOLOv5的复杂场景下SAR图像船舶检测方法

前言 此前出了目标改进算法专栏,但是对于应用于什么场景,需要什么改进方法对应与自己的应用场景有效果,并且多少改进点能发什么水平的文章,为解决大家的困惑,此系列文章旨在给大家解读最新目标检测算法论文&#xff0…

Linux:shell编程(内含:1.shell简介+2.shell实操+3.shell的变量介绍+4.shell变量的定义)

1.shell简介: 解释:界面编写各种命令时,需要一个解释器,解释器先执行后给linux。执行完之后,结果返回给界面。经常使用的是bash。 注:若界面执行的命令比较复杂,可以写一个脚本,xxx…

医疗健康产品展:联影医疗

​ 国内医疗健康行业的独角兽公司(估值超10亿) 联影医疗 1 基本信息 联影医疗是一家医疗设备和医疗信息化解决方案提供商,为医疗机构提供涵盖影像诊断设备、放疗设备、服务培训、医疗IT的全方位医疗解决方案。 联影筹建于2010年10月&…

第七章 树与森林

树与森林 7.1树的概念与表示 7.1.1树的定义及相关术语 1.树的定义 ​ 树(Tree)是n(n≥0)个有限数据元素的集合。当n=0时,称这棵树为空树。在一棵非树T中: ​ ⑴有一个特殊的数据…

算法常见高数知识

文章目录1. 偏微分方程和常微分方程1.1 偏微分1.2 常微分2. 表示方法(名词/notation)2.1 莱布尼兹表示3. 空间直线及其方程4. 方向向量4.1 两点求方向向量高数课本(有目录)可以看这个链接:1. 高等数学第六版.同济大学数学系.扫描版.pdf 1. 偏…

《InnoDB引擎‍》 MySQL缓存池

‍MySQL缓存池 InnoDB存储引擎是基于磁盘存储的,并将其中记录按照页的方式进行管理。因此可以将其视为基于磁盘的数据库。 在数据库系统中,由于CPU速度和磁盘速度之间的鸿沟,基于磁盘的数据库系统通常使用缓冲池技术来提高数据库整体性能。 缓…

阿里P8MySQL,基础/索引/锁/日志/调优都不误,一锅深扒端给你

阿里P8MySQL,你知道都问些啥吗?昨天小编特意去搜集了一些MySQLP8问题,经过整理归纳分为基础、索引、锁、日志、调优、开放问题等等168道题目,拿出这些题来测试一下自己水平可否??? 先上一张MySQ…

Tomcat 源码解析一请求处理的整体过程-黄泉天怒(上)

本博客的很多的理论知识都来源于 《Tomcat内核设计剖析》这本书,大家的兴趣去读这本书,对于想了解Tomcat源码的小伙伴,肯定对你有所帮助 ,但是想自己有亲身体会的话,还是要深入源码。 不然知道这些理论的知识&#xff…

Java面向对象:封装

1.封装: 面向对象的三大特征: 封装、继承、多态 它是什么: 封装:告诉我们,如何正确设计对象的属性和方法。 封装的原则:对象代表什么,就得封装对应数据,并提供数据对应的行为。 …

GUI编程--PyQt5--QWidget

文章目录QWidget简介功能作用控件的创建坐标系统控件位置与大小调整位置与尺寸最大、最小尺寸控件内容外边距设置鼠标的形状鼠标跟踪QWidget简介 控件是用户界面的最小元素,是一个矩形局域。没有父控件的控件为顶级控件,会装饰一个标题栏,成…

CentOS7源码安装 lldpd 并附查询脚本

文章目录源码安装 lldpd查询交换机端口的 lldpd 脚本查询交换机端口的 lldpad 脚本关于CentOS7上配置LLDP的文章,网络上已经很多了。实现交换机端口的抓取,众多周知的有两种工具,一种是lldpad,另一种是lldpd。 源码安装 lldpd 在…

get_post (攻防世界)(简单php)

前言: 这篇文章还是是为了帮助一些 像我这样的菜鸟 找到简单的题解 题目描述 进入网址 解题工具: 需要使用hackerbar (也可以用burpsuite) 问题解析: 科普时间又到 GET方法 用来向服务器请求数据。 是常见的HTTP方法之一。 查询字符是在URL中发送的: /…

led台灯哪个牌子质量好?2022最新的台灯牌子排名

众所周知,现在绝大部分台灯都是使用led灯珠作为发光源,led台灯作为主流的选择,在光线舒适度、光线调控性、台灯售价、显色与防护、节能环保等方面都是非常出色的,远超以前的传统白炽灯。那么现在市面上led台灯这么多,选…