Springboot 过滤器、拦截器、全局异常处理

Springboot 过滤器、拦截器、全局异常处理

一 过滤器(Filter)

过滤器是JavaWeb三大组件(Servlet,Filter,Listener)之一。

Filter可以把对资源的请求拦截下来,从而实现一些功能。

注意:过滤器一般用于一些通用的操作,比如登录校验,统一编码处理,敏感字符处理等。

1.定义过滤器

1.创建一个类,实现 javax.servlet.Filter接口,并且实现其方法。

2.配置过滤器

在类上增加 @WebFilter 注解,配置拦截资源的路径,并且在引导类上增加@ServletComponentScan开启Servlet的组件支持。

注意:Filter 是JavaWeb的组件,并非Spring组件,所以还需要在引导类上使用@ServletComponentScan开启对Filter组件的支持

@WebFilter
public class CustomFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 初始化方法,Web服务启动创建Filter时调用一次。可以不用重写Filter.super.init(filterConfig);}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws ServletException, IOException {// 拦截到请求时,调用该方法。是拦截器的核心filterChain.doFilter(servletRequest,servletResponse);}@Overridepublic void destroy() {// 销毁方法,服务器关闭时调用一次,可以不重写Filter.super.destroy();}
}

拦截器Filter的核心方法是 doFilter(),处理相关逻辑的代码几乎都写在此处。

可以通过@WebFilter注解的属性urlPatterns,来配置需要进行过滤的资源信息。

示例:使用 urlPatterns = "/*"配置过滤所有请求

@WebFilter(urlPatterns = "/*")
public class CustomFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws ServletException, IOException {//放行对资源的请求filterChain.doFilter(servletRequest,servletResponse);}
}

3.OncePerRequestFilter

在实际使用中推荐使用OncePerRequestFilter ,它是Spring框架提供的一个抽象类,用于确保过滤器只在每个请求中被调用一次。它继承自

GenericFilterBean类,并在 doFilter 方法中添加了对请求是否已被过滤的判断逻辑。

OncePerRequestFilterFilter 的根本区别在于 OncePerRequestFilter 提供了一个确保过滤器只在每个请求中被调用一次的机制,而 Filter

口本身并没有提供这样的机制。

@Configuration
public class JwtAuthenticationFilter extends OncePerRequestFilter {@Overrideprotected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {filterChain.doFilter(httpServletRequest, httpServletResponse);}}
}

而且使用OncePerRequestFilter的实现类,并不需要在项目的启动类上增加@ServletComponentScan注解。

二 拦截器(Interceptor)

1.拦截器概述

拦截器是一种动态拦截方法调用的机制,与过滤器类似。是Spring框架中提供的,用来动态拦截控制器方法的执行。

它的主要作用是拦截请求,在指定的方法前后调用,根据业务需要执行预先设定的代码。

2.定义拦截器(Interceptor)

定义一个拦截器,继承HandlerInterceper,并实现其方法。

HandlerInterceptor中的方法都提供了默认实现,可根据业务需求来决定重写哪些方法。

注意要为拦截器添加@Component注解,将其交给IOC容器管理。

@Component
public class CustomInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//在目标资源方法执行前执行,返回true放行,false 不放行return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {//在目标资源方法之后执行HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {//在整体请求完成之后调用HandlerInterceptor.super.afterCompletion(request, response, handler, ex);}
}
  • @Component注解是Spring框架中用于表示一个类为Spring组件的通用注解,通过添加@Component注解,可以告诉Spring容器在项目初始化时将该类实例化为一个Bean,并由Spring容器管理。
  • HandlerInterceptor是SpringMVC框架中的拦截器接口,用于拦截请求的处理过程并进行响应的处理。可以通过实现HandlerInterceptor类来自定义拦截器,实现更灵活的业务控制。

3.注册拦截器

自定义的拦截器,需要进行注册。可实现WebMvcConfigurer 接口,实现 addInterceptors方法,为其添加新的拦截器。

@Configuration
public class SpringWebConfigurer implements WebMvcConfigurer {//方式1:如果在定义拦截器的时候已经添加了@Component注解,则直接使用注入的方式,将拦截器对象注册到InterceptorRegistry对象中@Resourceprivate CustomInterceptor customInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 使用 addPathPatterns 添加拦截路径,支持数组// /**表示拦截所有资源,属于 AntPathMatcher(蚂蚁路径匹配器)语法//方式1:使用注入的对象registry.addInterceptor(customInterceptor).addPathPatterns("/**");//方式2:也可以直接创建对象,添加到InterceptorRegistry对象中registry.addInterceptor(new CustomInterceptor()).addPathPatterns("/**");}
}
  • InterceptorRegistry是Spring框架中专门用来管理拦截器的集合类。通过InterceptorRegistry对象,可以添加拦截器。并且指定它们的执行顺序。

  • WebMvcConfigurer是Spring框架中用于配置Mvc特性的接口,通过实现WebMvcConfigurer接口,可以对SpringMVC进行自定义配置,包括添加拦截器,资源处理器,视图解析器等。

  • @Configuration注解是Spring框架中用于表示配置类的注解,通过添加@Configuration注解,可以告诉Spring容器,该类是一个配置类,其中包含了一些配置信息,例如 Bean的定义,Bean之间的依赖关系,组件扫描等。

  • addPathPatterns方法用来配置需要拦截的资源路径。

  • excludePathPatterns方法用来配置不需要拦截的资源路径。

4.AntPathMatcher

Ant风格的路径模式匹配,AntPathMatcher支持以下通配符:

  • ? 匹配一个字符
  • * 匹配0个或多个字符
  • ** 匹配0个或多个目录

5.拦截路径

拦截路径的简单示意:

在这里插入图片描述

6.过滤器和拦截器的执行流程

当过滤器与拦截器同时存在时,它们的执行流程如下:

在这里插入图片描述

dispatcherServlet的说明:

dispatcherServlet是SpringMVC框架中的一个关键组件,用于所有进入应用程序的请求并将其分派到相应的处理程序(Controller)进行处理.

dispatcherServlet是一个Servlet,负责接收HTTP请求并根据请求的URL,将请求分发给合适的Controller。

dispatcherServlet可以通过配置来定制各种行为,包括URL映射,视图解析,异常处理等。是整个SpringMVC框架的核心,负责协调各个组件的工作,实现请求的处理和响应的生成。

执行流程说明:

  1. 浏览器发送请求,先到过滤器(Filter)
  2. 过滤器(Filter)放行之后,HTTP请求经过dispatcherServlet的派发到达拦截器(Interceptor)
  3. 拦截器(Interceptor)放行之后,请求才会真正进入处理程序(Controller)
  4. 处理程序(Controller)生成响应结果,将结果返回到拦截器(Interceptor)
  5. 拦截器(Interceptor)最后再将结果返回过滤器(Filter),最后响应给浏览器

7.过滤器和拦截器的区别

  • 接口规范不同:过滤器需要实现Filter接口;而拦截器需要实现HandlerInterceptor接口,并且需要注册到InterceptorRegistry集合中。
  • 拦截范围不同:过滤器会拦截所有的请求资源;而拦截器只会拦截Spring环境中的资源。

三 全局异常处理

定义一个类并且使用 @RestControllerAdvice 注解,则表明我们定义了一个全局异常处理类。

然后创建方法来捕获异常,并且通过@ExceptionHandler注解来表明要捕获的异常类型。并且将该异常的对象作为形参传入方法中。

@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(RuntimeException.class)public Result runtimeException(RuntimeException runtimeException) {return Result.err(runtimeException.getMessage());}
}

注意:Result是一个自定义的统一响应格式类,其中包含了响应代码,响应消息,和响应数据。并且定义了几个常用的静态方法。

以上示例中,为保证返回格式统一,所以使用了Result作为返回类型。

  • @RestControllerAdvice@RestControllerAdvice 用于定义一个全局的异常处理类,它结合了 @ControllerAdvice@ResponseBody 两个注解的功能。在 Spring Boot 应用中,我们可以使用 @RestControllerAdvice 注解来统一处理异常,返回统一的错误信息给前端。
  • @ExceptionHandler@ExceptionHandler 用于在 Spring MVC 控制器类中定义方法来处理特定类型的异常。当控制器中的方法抛出指定类型的异常时,@ExceptionHandler 注解的方法会被调用来处理该异常,从而提供定制化的异常处理逻辑

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

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

相关文章

低代码工具APEX的入门使用(未包含安装)

第一次使用APEX是2019年,这个技术成名已久只是我了解的比较晚。请看Oracle ACE的网站,这就是用APEX做的。实际上有一次我看O记的人操作他们的办公流程,都是用APEX做的。 那一年,我用APEX做了一个CMDB的管理系统。那时候还没有流行…

美摄科技实时语音数字人解决方案

随着科技的飞速发展,数字人技术已经逐渐渗透到我们生活的各个角落。作为数字人技术的先驱者,美摄科技凭借其卓越的实时语音数字人解决方案,正引领着企业步入一个全新的交互时代。 美摄科技的实时语音数字人解决方案,是基于语音和…

HCIA-Datacom题库(自己整理分类的)_33_DHCP协议多选【7道题】

1.使用动态主机配置协议DHCP分配IP地址有哪些优点? 可以实现IP地址重复利用 工作量大且不好管理 配置信息发生变化(如DNS),只需要管理员在DHCP服务器上修改,方便统一管理 避免IP地址冲突 2.网络中部署了一台DHCP服务器,但是管理员发现部分主机并没有正确获取到该DHCP服务…

产品说明书模板帮你写好了,快来抄作业

想要写好产品说明书,想在网络上参考,信息繁杂且各有不同,东拼西凑也写不出一个好的产品说明书。这时候,如果有产品说明书模板,不仅可以可以提高工作效率,还能保持产品说明书的一致性、提供参考和指导&#…

Mysql删除重复项:力扣196. 删除重复的电子邮箱

题目链接:196. 删除重复的电子邮箱 - 力扣(LeetCode) 题目描述 sql语句 # Write your MySQL query statement below delete a from person as a inner join person as b where a.email b.email and a.id > b.id 思路:内连接…

Windows下JDK下载、配置Java环境变量配置及多个JDK使用

Windows下JDK下载、配置Java环境变量配置及多个JDK使用 1. Windows下配置Java-JDK环境变量 1.1 下载Windows版本JDK 下载地址:(https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html) 1.2 Windows下安装JDK 双击进行安装 下一步&#xf…

3.8焕新周什么值得入手?索尼耳机选购指南帮你挑

一年一度的女王节活动即将来临,春暖花开好时候,女生们的购物欲想必也开始蠢蠢欲动。如果想要购入一款降噪耳机,索尼这个品牌是你必须要考虑的选择之一。索尼作为在音频行业耕耘70余年的音频世家,秉持“For The MUSIC为音乐而生”的…

解决uni-app中使用webview键盘弹起遮挡input输入框问题

这个平平无奇的回答&#xff0c;可能是全网最靠谱的解决方案。 这里我用的是vue3 setup .vue文件的方式 <view> <web-view :fullscreen"false" :webview-styles"{top: statusBarHeight40,height:height,progress: {color: green,height:1px } }"…

哪里有优质短视频素材网站?分享高质量的短视频素材网站资源

嘿&#xff0c;小伙伴们&#xff0c;是不是在做短视频的时候总觉得少点什么味道&#xff1f;那肯定是因为缺少了那些能让你的视频“味道”更足的素材啦。不用愁&#xff0c;今天我来给大家分享几个超给力的短视频素材网站&#xff0c;保证让你的创作更上一层楼 1蛙学府资源 这…

【C++】String常用的函数总结

一、string的构造函数方式&#xff1a; 代码形式&#xff1a; void Test1() {string s1(); // 空字符串string s2("Hello World"); // 字符串初始化为 "Hello World" string s3(s2); //拷贝构造: 将s2复制给s3、 输出为: Hello Worldstring s4(s2,…

[DevOps云实践] IaaC:通过CloudWatch Agent和自定义Metric监视服务器

[DevOps云实践] IaaC:通过CloudWatch Agent和自定义Metric监视服务器 现在有许多第三方工具可以用于监控EC2实例。尽管事实如此,我想为您提供使用AWS原生资源和工具(如AWS CloudWatch、CloudWatch Agent和CloudFormation)快速设置EC2监控所需的所有信息。 首先,您应该知…

常用通讯协议的理解

一、通讯的一些基本认知 1、什么是异步或同步通信 异步通信在发送字符时&#xff0c;所发送的字符之间的时间间隔可以是任意的。发送端可以在任意时刻开始发送字符&#xff0c;因此必须在每一个字符的开始和结束的地方加上标志&#xff0c;即加上开始位和停止位&#xff0c;以…

Redis 由浅入深 (7) - 集群操作手册

目录 Redis运维查询命令登录redis集群&#xff08;登录任意一台即可&#xff09;查询redis集群信息&#xff08;登录之后&#xff09;通过客户端执行命令&#xff08;redis-cli&#xff09;查询正则“pattern”所有的key redis 启动和创建的命令Redis 常用命令redis 手动命令设…

【深度学习】脑部MRI图像分割

案例4&#xff1a;脑部MRI图像分割 相关知识点&#xff1a;语义分割、医学图像处理&#xff08;skimage, medpy&#xff09;、可视化&#xff08;matplotlib&#xff09; 1 任务目标 1.1 任务简介 本次案例将使用深度学习技术来完成脑部MRI(磁共振)图像分割任务&#xff0c…

ETH网络权益证明(PoS)

权益证明 - POS 权益证明是一种证明验证者已经将有价值物品质押到网络上的方法。如果验证者有失信行为&#xff0c;这些物品可能会被销毁。 在以太坊的权益证明机制下&#xff0c;验证者明确地通过以太币将资产质押到以太坊上的智能合约中。 之后&#xff0c;验证者负责检查在网…

python概率分析:为什么葫芦娃救爷爷是一个一个地救成功率最高?

关键词&#xff1a; Python 、葫芦娃 、 概率计算 、 数学 、 建模 前言 过完年了返工后想起了小孩子们爱看的葫芦娃救爷爷的动画片&#xff0c;葫芦娃为什么是一个一个前去救爷爷&#xff0c;为什么不等着七个一起去救爷爷。带着这个疑问&#xff0c;我决定今天用数学的角度…

Linux开发工具使用

一、Linux软件包管理器 yum 软件包和软件包管理器, 就好比 "App" 和 "应用商店" &#xff0c;我们现在要安装的yum就是相当于在我们的Linux终端安装一个"应用商店"。 但使用yum时&#xff0c;我们一定要保证主机(虚拟机)网络畅通!这点也非常好理…

分类问题经典算法 | 二分类问题 | Logistic回归:公式推导

目录 一. Logistic回归的思想1. 分类任务思想2. Logistic回归思想 二. Logistic回归算法&#xff1a;线性可分推导 一. Logistic回归的思想 1. 分类任务思想 分类问题通常可以分为二分类&#xff0c;多分类任务&#xff1b;而对于不同的分类任务&#xff0c;训练的主要目标是…

RabbitMQ(三):AMQP协议

目录 1 AMQP协议1.1 AMQP协议介绍1、AMQP是什么2、消息代理中间件的职责 1.2 AMQP 0-9-1模型1、AMQP的工作过程2、交换器和交换器类型3、队列队列属性队列名称队列持久化 1.3 几个概念1、绑定2、消费者3、消息确认4、预取消息5、消息属性和有效载荷&#xff08;消息主体&#x…

HTML5:七天学会基础动画网页7

CSS3高级特效 2D转换方法 移动:translate() 旋转:rotate() 缩放:scale() 倾斜:skew() 属性:transform 作用:对元素进行移动,旋转,缩放,倾斜。 2D移动 设定元素从当前位置移动到给定位置(x,y) 方法 说明 translate(x,y) 2D转换 沿X轴和Y轴移…