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

文章目录

  • 一、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.xdnf.cn/news/146764.html

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

相关文章

C语言题目之单身狗2

文章目录 一、题目二、思路三、代码实现 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、题目 二、思路 第一步 在c语言题目之打印单身狗我们已经讲解了在一组数据中出现一个单身狗的情况&#xff0c;而本道题是出现两个单身狗的情况。根据一个数…

查询 B 站注册时间

有时候想看看自己玩 B 站多少年了&#xff0c;想知道自己什么时候注册的。 此外&#xff0c;据说注销 B 站账户的话也得提供详细注册日期。 ‍ 通过创作中心查看 登录网页版 B 站&#xff0c;点击右上角的创作中心&#xff0c;然后就能看到在 B 站多少天了&#xff1a; ​…

基于JAVA+SpringBoot+Vue的医院资源管理系统

基于JAVASpringBootVue的医院资源管理系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末附源码下载链接&#x1f345; 哈…

Qt开发技巧(七)动态换图,QVideoWidget视频闪烁,Qt日志打印,系统消息处理,编译前后的操作,QSettings配置文件,屏幕自适应

1.动态换图 Qt开发时&#xff0c;有时候我们在界面上需要动态的切换图片&#xff0c;比如接到来自底层驱动的信号分成告警信号&#xff0c;正常信号&#xff0c;危险信号&#xff0c;在界面上使用QLabel通过贴图来表示不同的信号&#xff0c;这时候尽量使用setStyleSheet()&…

和可被k整除的子数组问题

目录 一题目&#xff1a; 二思路&#xff1a; 三代码&#xff1a; 一题目&#xff1a; leetcode链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 二思路&#xff1a; 思路&#xff1a;前缀和第二种表示方式即循环列出方式同余定理取模修正&#xff1a; 还是通…

这可能又是一款 Java 程序员的必备插件了,无需解压直接编辑修改 jar 包内文件,神器!(附源码)

作为一名 Java 程序员&#xff0c;在维护一些古老的程序时&#xff0c;可能会遇到这种情况&#xff1a;项目依赖的 jar 包过于久远&#xff0c;已经没有源码了&#xff0c;但是有不得不修改的 bug 要处理。这时候就得想办法反编译 jar 包进行修改&#xff0c;并且重新打包&…

Java反序列化利用链篇 | CC1链的第二种方式-LazyMap版调用链

文章目录 CC1链的第二种方式-LazyMap版调用链LazyMap构造payloadCC1的调用链 系列篇其他文章&#xff0c;推荐顺序观看~ Java反序列化利用链篇 | JdbcRowSetImpl利用链分析Java反序列化利用链篇 | CC1链_全网最菜的分析思路Java反序列化利用链篇 | CC1链的第二种方式-LazyMap版…

网站设计中安全方面都需要有哪些考虑

网站设计中的安全性是一个多方面的问题&#xff0c;需要从多个角度进行考虑和实施。以下是一些关键的安全考虑因素&#xff1a; 数据加密&#xff1a; 使用SSL&#xff08;安全套接字层&#xff09;证书来建立加密连接&#xff0c;确保数据在传输过程中不被截获。定期更新SSL证…

低空经济火爆,稀缺无人机教员培训详解

随着科技的飞速发展和低空经济的日益火爆&#xff0c;无人机技术已广泛应用于航拍、农业、物流、救援、环境监测等多个领域&#xff0c;成为推动社会经济发展的新引擎。然而&#xff0c;无人机行业的快速发展也催生了对专业无人机教员的迫切需求。本文将从基础理论学习、实操技…

制造业缺陷检测

制造业缺陷检测是一种在生产过程中检测和识别产品缺陷的技术。它旨在确保产品质量符合制定的标准&#xff0c;从而减少浪费、提高生产效率&#xff0c;并保证最终产品的安全性和可靠性。这种检测通常使用各种技术手段&#xff0c;包括但不限于&#xff1a; 视觉检测系统&#…

静态链表:实现、操作与性能优势【算法 16】

静态链表&#xff1a;实现、操作与性能优势 在算法和数据结构的探索中&#xff0c;链表作为一种基础且灵活的数据结构&#xff0c;广泛应用于各种场景。然而&#xff0c;在算法竞赛或需要高效内存管理的环境中&#xff0c;传统的动态链表可能会因为内存分配和释放的开销而影响性…

爆痘的分级和相应的处理

痘痘的分级 轻度 一级 无炎症性,粉刺总数不超过30个,有少量丘疹和脓疱中度 二级/三级 皮肤表面出现炎性丘疹损害,病损数为30-50个有中等数量的丘疹、脓疱 皮肤炎性损害加重,有大量丘疹和脓疱,并且伴有结节在三个以内,病损数为50-100个重度 四级 除炎性皮疹外,结节与囊肿为主…

SFUD库移植

1.源码 GitHub - armink/SFUD: An using JEDECs SFDP standard serial (SPI) flash universal driver library | 一款使用 JEDEC SFDP 标准的串行 (SPI) Flash 通用驱动库 2.介绍 这个通用驱动库,实际就是帮你封装好了读写spiflash的函数, 我们只需要对接以下底层,就可以轻松…

助力降糖新品“五菌膏”上市 科技特派员秋季行硕果累累

近日&#xff0c;武汉市“科技助力乡村振兴科技特派员秋季行活动”在武汉举行&#xff0c;此次活动由长江新区管委会、市科创局、武汉轻工大学主办&#xff0c;长江新区科技创新与成果转化局、武汉市科技成果转化促进中心、武汉市科技特派员创新联盟承办。 9月19日&#xff0c;…

VM虚拟机下载以及激活

传统的官网已经找不到下载了&#xff0c;这里我将下载好的放在阿里云盘&#xff0c;百度云盘太慢了&#xff0c;懂得都得 阿里云盘分享 下载好了后会是一个exe文件&#xff0c;直接双击运行就可 下载无脑下一步即可&#xff0c;这里不做介绍 下载好了后&#xff0c;需要密钥这里…

免费的AI测肤

AI测肤 https://beifuting.com/

实用好软-----电脑端 全能音视频转换器 转换各种音视频格式

软件介绍&#xff1a; 工具是一款免费的视频格式转换软件&#xff0c;支持几乎所有视频格式的转换&#xff0c;基本的有DVD, AVI, MP4, 3GP, WMV, ASF等格式。对于一些特殊格式的视频&#xff0c;不用担心看不到&#xff0c;除了保证转换质量&#xff0c;还能转换为你想要的类…

[图解]静态关系和动态关系

1 00:00:01,060 --> 00:00:04,370 首先我们来看静态关系和动态关系 2 00:00:06,160 --> 00:00:10,040 我们要尽量基于静态关系来建立动态关系 3 00:00:11,740 --> 00:00:13,740 不能够在没有这个的基础上 4 00:00:14,220 --> 00:00:17,370 没有这个的情况下就胡…

vue3 选择字体的颜色,使用vue3-colorpicker来选择颜色

1、有的时候我们会用到颜色的选择器&#xff0c;像element-plus提供了&#xff0c;但是ant-design-vue并没有&#xff1a; 这个暂时没有看到&#xff1a; 但是Ant Design 5的版本有&#xff0c;应该不是vue的。 2、使用第三方提供的vue3-colorpicker&#xff1a;storybook/cli…

《程序猿之设计模式实战 · 模板方法》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…