SpringMVC 中的拦截器与异常处理器

news2024/9/21 20:52:08

文章目录

  • 一、SpringMVC 拦截器
    • (一)拦截器的概念
    • (二)拦截器的三个抽象方法
    • (三)多个拦截器的执行顺序
  • 二、SpringMVC 异常处理器
    • (一)异常处理的重要性
    • (二)基于配置的异常处理
    • (三)基于注解的异常处理
  • 三、总结

在 SpringMVC 框架中,拦截器(Interceptor)和异常处理器(Exception Handler)是两个非常重要的组件,它们分别在不同的方面为应用程序提供了强大的功能。本文将详细介绍 SpringMVC 中的拦截器和异常处理器,包括拦截器的三个抽象方法、多个拦截器的执行顺序,以及基于配置和注解的异常处理方式。

一、SpringMVC 拦截器

(一)拦截器的概念

拦截器是 SpringMVC 中一种强大的机制,它可以在请求处理的不同阶段进行干预,实现诸如日志记录、权限校验、性能监控等功能。拦截器可以拦截用户的请求,并在请求到达控制器之前或之后执行一些特定的操作。

(二)拦截器的三个抽象方法

  1. preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
    • 这个方法在请求处理之前被调用。
    • 返回值为boolean类型,如果返回true,则表示继续执行后续的处理器(如控制器方法);如果返回false,则中断后续的处理流程。
    • 可以在这个方法中进行一些前置处理,比如权限校验、日志记录等。
    • 例如:
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        System.out.println("preHandle 方法被调用");
        // 进行权限校验
        if (request.getSession().getAttribute("user") == null) {
            response.sendRedirect(request.getContextPath() + "/login.jsp");
            return false;
        }
        return true;
    }
    
  2. postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
    • 这个方法在请求处理之后,视图渲染之前被调用。
    • 可以在这个方法中对模型数据进行修改,或者对响应进行一些额外的处理。
    • 例如:
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        System.out.println("postHandle 方法被调用");
        if (modelAndView!= null) {
            modelAndView.addObject("timestamp", System.currentTimeMillis());
        }
    }
    
  3. afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
    • 这个方法在视图渲染之后被调用,无论请求处理是否成功都会执行。
    • 可以在这个方法中进行一些资源清理、日志记录等操作。
    • 例如:
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        System.out.println("afterCompletion 方法被调用");
    }
    

(三)多个拦截器的执行顺序

当应用程序中配置了多个拦截器时,它们的执行顺序是有规律的。拦截器的执行顺序与它们在配置文件中的声明顺序一致。

  1. 首先,第一个拦截器的preHandle方法被调用。
  2. 如果第一个拦截器的preHandle方法返回true,则继续执行下一个拦截器的preHandle方法,依此类推,直到所有拦截器的preHandle方法都被调用完毕。
  3. 然后,请求被转发到控制器方法进行处理。
  4. 控制器方法处理完成后,按照相反的顺序调用各个拦截器的postHandle方法。
  5. 最后,按照相反的顺序调用各个拦截器的afterCompletion方法。

例如,假设有两个拦截器Interceptor1Interceptor2,它们的执行顺序如下:

  1. Interceptor1.preHandle()
  2. Interceptor2.preHandle()
  3. 控制器方法处理请求
  4. Interceptor2.postHandle()
  5. Interceptor1.postHandle()
  6. Interceptor2.afterCompletion()
  7. Interceptor1.afterCompletion()

二、SpringMVC 异常处理器

(一)异常处理的重要性

在应用程序的开发过程中,异常情况是不可避免的。如果不进行适当的处理,异常可能会导致应用程序崩溃,或者给用户返回不友好的错误信息。因此,在 SpringMVC 中,提供了强大的异常处理机制,可以对不同类型的异常进行统一的处理,提高应用程序的稳定性和用户体验。

(二)基于配置的异常处理

  1. 在 SpringMVC 的配置文件中,可以使用<bean>标签配置异常处理器。
    • 例如:
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
                <prop key="java.lang.ArithmeticException">error.jsp</prop>
            </props>
        </property>
    </bean>
    
    • 在上面的配置中,当发生java.lang.ArithmeticException异常时,会跳转到error.jsp页面进行错误处理。
  2. 可以配置多个异常映射,对不同类型的异常进行不同的处理。

(三)基于注解的异常处理

  1. 使用@ControllerAdvice注解定义一个全局的异常处理类。
    • 例如:
    @ControllerAdvice
    public class GlobalExceptionHandler {
    }
    
  2. 在异常处理类中,可以使用@ExceptionHandler注解定义针对特定异常的处理方法。
    • 例如:
    @ControllerAdvice
    public class GlobalExceptionHandler {
        @ExceptionHandler(ArithmeticException.class)
        public ModelAndView handleArithmeticException(ArithmeticException ex) {
            ModelAndView modelAndView = new ModelAndView();
            modelAndView.setViewName("error.jsp");
            modelAndView.addObject("errorMessage", ex.getMessage());
            return modelAndView;
        }
    }
    
    • 在上面的代码中,当发生ArithmeticException异常时,会调用handleArithmeticException方法进行处理,并返回一个包含错误信息的ModelAndView对象,跳转到error.jsp页面进行错误显示。

三、总结

SpringMVC 中的拦截器和异常处理器是非常强大的组件,它们可以帮助我们实现各种功能,提高应用程序的稳定性和可维护性。拦截器可以在请求处理的不同阶段进行干预,实现诸如权限校验、日志记录等功能;异常处理器可以对不同类型的异常进行统一的处理,提高应用程序的用户体验。在实际的开发过程中,我们可以根据具体的需求,灵活地使用拦截器和异常处理器,为应用程序提供更好的服务。

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

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

相关文章

【AcWing】873. 欧拉函数

#include<iostream> using namespace std;int main(){int n;cin>>n;while(n--){int x;cin>>x;int resx;for(int i2;i<x/i;i){if(x%i0){//resres*(1-1/i);整数1/i等于0&#xff0c;算不对且会溢出//以下几种都能ac//resres/i*(i-1);i*(1-1/i)i-1&#xff0…

通过标签实现有序:优化你的 FastAPI 生成的 TypeScript 客户端

在软件开发的世界里&#xff0c;API 客户端代码的质量直接影响着应用程序的性能和可维护性。随着项目规模的扩大&#xff0c;自动化生成的代码往往变得臃肿且难以管理。但幸运的是&#xff0c;通过一系列的优化策略&#xff0c;我们可以显著提升这些代码的优雅与效能。在本文中…

计算机网络(八) —— Udp协议

目录 一&#xff0c;再谈端口号 1.1 端口号 1.2 netsta命令 二&#xff0c;UDP协议 2.1 关于UDP 2.2 Udp协议格式 2.3 Udp协议特点 2.4 Udp的缓冲区 一&#xff0c;再谈端口号 http协议本质是“请求 - 响应”形式的协议&#xff0c;但是应用层需要先将数据交给传输层&…

2024/9/21 408 20题

a b 58-130-180-199-42-15&#xff1a;c d a 184-182-187-176-19941 c d a a c b d c a c b c c c

12V转100V低压升高压DC/DC电源GRB12-100D-100mA-Uz(0-3V)

特点 ● 效率高达75%以上 ● 1*2英寸标准封装 ● 单电压输出 ● 超高性价比 ● 电压控制输出,输出电压随控制电压的变化而线性变压 ● 工作温度: -40℃~75℃ ● 阻燃封装&#xff0c;满足UL94-V0 要求 ● 温度特性好 ● 可直接焊在PCB 上 应用 GRB 系列模块电源是一…

深度学习笔记17_TensorFlow实现咖啡豆识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 一、我的环境 1.语言环境&#xff1a;Python 3.9 2.编译器&#xff1a;Pycharm 3.深度学习环境&#xff1a;TensorFlow 2.10.0 二、GPU设置…

linux操作系统的基本命令

1.linux下的文件系统 在linux操作目录下没有像window操作系统下盘符的概念,只有一个根目录/,所有文件目录都在它的下面 linux的目录结构: 在Linux系统中: 文件都从跟目录开始的,用/表示文件名称区分大小写路径都是以/俩进行分隔(windown用\分隔)以.开头的文件为隐藏文件 Li…

Java反序列化利用链篇 | CC6链分析(通用版CC链)

文章目录 CC6和CC1之间的区别CC6的调用链构造CC6的payload完成TiedMapEntry.getValue()完成TiedMapEntry.hashCode()完成HashMap.hash()及HashMap.readObject()解决hash()方法提前触发的问题 系列篇其他文章&#xff0c;推荐顺序观看~ Java反序列化利用链篇 | JdbcRowSetImpl利…

LeetCode[中等] 215. 数组中的第 K 个最大元素

给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 思路&#xff1a;基于快排改进的快速…

【AI算法岗面试八股面经【超全整理】——深度学习】

AI算法岗面试八股面经【超全整理】 概率论【AI算法岗面试八股面经【超全整理】——概率论】信息论【AI算法岗面试八股面经【超全整理】——信息论】机器学习【AI算法岗面试八股面经【超全整理】——机器学习】深度学习CVNLP 目录 1、激活函数2、Softmax函数及求导3、优化器 1、…

LED灯、蜂鸣器、继电器的控制

LED灯的控制 该专栏所有文章都默认使用STM32F103ZET6开发板 目录 LED灯的控制 一、简单的LED灯控制 1、初始化函数 led灯 2、应用函数 2、蜂鸣器 3、继电器 一、简单的LED灯控制 编程框架&#xff1a;初始化函数和应用函数 1、初始化函数 初始化函数一般包括&#xf…

【学术会议:中国厦门,为全球的计算机科学与管理科技研究者提供一个国际交流平台】第五届计算机科学与管理科技国际学术会议(ICCSMT 2024)

您的学术研究值得被更多人看到&#xff01; 在这里&#xff0c;我为您提供精准的会议推荐&#xff0c;包括计算机科学、管理科技、信息系统、人工智能、供应链管理等领域的国际会议。高效的稿件录用流程和优质的检索服务将确保您的研究成果迅速传播。关注我&#xff0c;寻找与…

Java免税商品优选商城:Spring Boot实战

第二章 系统开发关键技术 2.1 JAVA技术 Java主要采用CORBA技术和安全模型&#xff0c;可以在互联网应用的数据保护。它还提供了对EJB&#xff08;Enterrise JavaBeans&#xff09;的全面支持&#xff0c;java servlet AI&#xff0c;JS&#xff08;java server ages&#xff09…

[Matplotlib教程] 02 折线图、柱状图、散点图教程

基于MFCC和CNN的语音情感识别 2 折线图、柱状图、散点图2.1 折线图2.1.1 简单折线图2.1.1 线形和Markevery2.1.2 带误差棒的折线图2.1.3 区间填充和透明度 2.2 柱状图2.2.1 分组柱状图2.2.2 堆叠柱状图2.2.3 横向柱状图 2.3 散点图 我们的网站是 菜码编程&#xff0c;我们的q群…

解决Hive乱码问题

在插入数据后&#xff0c;发现hive乱码 原因&#xff1a;Hive默认将存储表结构的元数据列编码设置为latin1&#xff0c;不支持中文 解决方法&#xff1a;在MySQL中修改对应Hive元数据列的编码 先查看mysql的所有字符集编码 1、先修改my.cnf 代码如下&#xff1a; vim /etc/…

C++——初步认识C++和namespace的用法

1.编程语言排行榜 我们通过排行可以看出 C在变成语言中还是占据着重要的地位 2.C在工作领域中的应用 1.PC客户端开发。⼀般是开发Windows上的桌面软件&#xff0c;比如WPS之类的&#xff0c;技术栈的话⼀般是C和 QT&#xff0c;QT 是⼀个跨平台的 C图形用户界面&#xff08;G…

【解决】chrome 谷歌浏览器,鼠标点击任何区域都是 Input 输入框的状态,能看到输入的光标

chrome 谷歌浏览器&#xff0c;鼠标点击任何区域都是 Input 输入框的状态&#xff0c;能看到输入的光标 今天打开电脑的时候&#xff0c;网页中任何文本的地方&#xff0c;只要鼠标点击&#xff0c;就会出现一个输入的光标&#xff0c;无论在哪个站点哪个页面都是如此。 我知道…

Nature Communications|一种快速响应的智能可穿戴嗅觉接口(可穿戴电子/柔性电子/人机交互)

香港城市大学于欣格( Xinge Yu)、北京航空航天大学李宇航(Yuhang Li)、中国特种设备检验研究所赵召(Zhao Zhao)和东京大学Takao Someya团队,在《Nature Communications》上发布了一篇题为“Intelligent wearable olfactory interface for latency-free mixed reality and …

云盘视频保护神器,支持云盘视频加密与在线播放,配合alist使用,超完美!

平时我们保护视频&#xff0c;一般都是采用压缩工具&#xff0c;进行加密打包&#xff0c;然后在上传到网盘存储。这虽然能起到很好的保护&#xff0c;但是有很多问题&#xff1f;比如&#xff1a;无法直接在线播放&#xff0c;还得从网盘中下载后解压&#xff0c;才能进行观看…

【Python语言初识(一)】

一、python简史 1.1、python的历史 1989年圣诞节&#xff1a;Guido von Rossum开始写Python语言的编译器。1991年2月&#xff1a;第一个Python编译器&#xff08;同时也是解释器&#xff09;诞生&#xff0c;它是用C语言实现的&#xff08;后面&#xff09;&#xff0c;可以调…