Spring MVC 拦截器执行流程

拦截器(HandlerInterceptor) 拦截器是相对于Spring中来说的,它和过滤器不一样,过滤器的范围更广一些是相对于Tomcat容器来说的。拦截器可以对用户进行拦截过滤处理。请求进入Controller之前,通过拦截器执行代码逻辑Controller执行之后(只是Controller执行完毕,视图还没有开始渲染),通过拦截器执行代码逻辑Controller完全执行完毕(整个请求全部结束),通过拦截器执行代码逻辑。 阅读详情

今天就是把有关拦截器的知识做一个总结。

1.拦截器概述

1.1 什么是拦截器?

Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。
要使用Spring MVC中的拦截器,就需要对拦截器类进行定义和配置。通常拦截器类可以通过两种方式来定义。
1.通过实现HandlerInterceptor接口,或继承HandlerInterceptor接口的实现类(如HandlerInterceptorAdapter)来定义。

2.通过实现WebRequestInterceptor接口,或继承WebRequestInterceptor接口的实现类来定义。

以实现HandlerInterceptor接口方式为例,自定义拦截器类的代码如下:


package com.mmm.interceptors;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
 * 创建自定义的拦截器
 01.务必实现 HandlerInterceptor!
 02.我们使用的拦截器其实就是针对于Handler的拦截器===》处理器拦截器
 03.核心控制器中的HandleMapping返回的就是一个
 处理器执行链 =  Handler+ Interceptors(处理器拦截器)
 */
public class MyInterceptor implements HandlerInterceptor{

    /**
     *
     * @param request
     * @param response
     * @param handler 打印出来com.mmm.controller.UserController@6225177c
     * @return
     * @throws Exception
     *
     *
     *   HandlerInterceptor接口中的三个方法:

            01.preHandle 如果返回值是false,则不会执行后续的操作! 一个拦截器
                preHandle如果返回值是true 则会执行下一个拦截器。。
            02.如果有多个拦截器,则之后拦截器中的所有方法都不会执行!
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("执行了  拦截器1111中的 ===》preHandle");

        return true;
    }

    /**
     * 之后指定了对应Handler中的方法之后 才执行!
     * @param modelAndView 打印出来 ModelAndView: reference to view with name 'success'; model is {welcome=恭喜您登录成功}
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("执行了  拦截器1111中的===》postHandle");

    }

    /**
     * 只要是当前拦截器中的preHandle返回true则此方法必须执行!
     * @param handler   打印出来com.mmm.controller.UserController@6225177c
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("执行了  拦截器1111的  ===》afterCompletion");
    }
}

上述代码中,自定义拦截器实现了HandlerInterceptor接口,并实现了接口中的三个方法:

  • preHandle() 方法:该方法会在控制器方法前执行,其返回值表示是否中断后续操作。当其返回值为true时,表示继续向下执行;
    当其返回值为false时,会中断后续的所有操作(包括调用下一个拦截器和控制器类中的方法执行等)。

  • postHandle()方法:该方法会在控制器方法调用之后,且解析视图之前执行。可以通过此方法对请求域中的模型和视图做出进一步的修改。

  • afterCompletion()方法:该方法会在整个请求完成,即视图渲染结束之后执行。可以通过此方法实现一些资源清理、记录日志信息等工作。

1.2 拦截器的配置

开发拦截器就像开发servlet或者filter一样,都需要在配置文件进行配置,配置代码如下:


    <!--配置自定义的拦截器-->
    <mvc:interceptors>
        <!--拦截器1-->
        <mvc:interceptor>
            <!--配置拦截器的作用路径-->
            <mvc:mapping path=  "/user/**"/><!--拦截的路径规则-->
            <!--定义在<mvc:interceptor>下面的表示匹配指定路径的请求才进行拦截-->
            <bean class="com.mmm.interceptors.MyInterceptor"/>
        </mvc:interceptor>
        <!--拦截器2-->
        <mvc:interceptor>
            <mvc:mapping path="/user/**"/><!--拦截的路径规则-->
            <bean class="com.mmm.interceptors.MyInterceptor2"/>
        </mvc:interceptor>

    </mvc:interceptors>

上面的代码中,<mvc:interceptors>元素用于配置一组拦截器,基子元素<bean>中定义的是全局拦截器,它会拦截所有的请求;而<mvc:interceptor>元素中定义的是指定路径的拦截器,它会对指定路径下的请求生效。<mvc:interceptor>元素的子元素<mvc:mapping>用于配置拦截器作用的路径,该路径在其属性path 中定义。如上述代码中 path 的属性值“/**” 表示拦截所有路径,“/hello” 表示拦截所有以 “/hello” 结尾的路径。如果在请求路径中包含不需要拦截的内容,还可以通过<mvc:exclude-mapping>元素进行配置。
注意:<mvc:interceptor>中的子元素必须按照上述代码中的配置顺序进行编写,即<mvc:mapping> <mvc:exclude-mapping> <bean>,否则文件会报错。

2. 拦截器的执行流程


1.程序先执行preHandle()方法,如果该方法的返回值为true,则程序会继续向下执行处理器中的方法,否则将不再向下执行。

2.在业务处理器(即控制器Controller类)处理完请求后,会执行postHandle()方法,然后会通过DispatcherServlet向客户端返回响应。

3.在DispatcherServlet处理完请求后,才会执行afterCompletion()方法。


进入了   login
执行了  拦截器1111中的 ===》preHandle
执行了  拦截器2222中的 ===》preHandle
进入了  main
执行了  拦截器2222中的===》postHandle
执行了  拦截器1111中的===》postHandle
执行了  拦截器2222的  ===》afterCompletion
执行了  拦截器1111的  ===》afterCompletion
springboot拦截器处理返回false请求 springboot拦截器,在返回true的情况下后面的任务继续执行。 在第一步的拦截中,如果返回false会继续处理后面的请求。 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { re... 阅读详情

相关推荐

Spring MVC拦截器的执行流程

本节我们主要讲解 SpringMVC 拦截器的执行流程。分两部分介绍,首先介绍单个拦截器执行流程然后介绍多个拦截器的执行流程。 单个拦截器的执行流程 在配置文件中如果只定义了一个拦截器,程序将首先执行拦截器类中的 preHandle 方法,如果该方法返回 true,程序将继续执行控制器中处理请求的方法,否则中断执行。如果 preHandle 方法返回 true,并且控制器中处理请求的方法执行后、返...

weixin_43748615的博客 432

自定义拦截器的实操

拦截器与过滤器的区别SpringMVC 的拦截器(Interceptor)与 Java Servlet 的过滤器(Filter)类似,它主要用于拦截用户的请求并做相应的处理,通常应用在权限验证、记录请求信息的日志、判断用户是否登录等功能上。

weixin_39158966的博客 1970

拦截器20231031

preHandle方法与afterCompletion方法总是成对出现的,一个拦截器的preHandle方法被调用后,afterCompletion方法必然也会被调用。通过控制台的输出信息,我们可以看到多个拦截器的执行顺序有些类似于数据结构中的栈——先进后出。突然一彪形大汉从树丛中窜出,面蒙黑巾,手持两把板斧,大喝道:“此山是我开,此树是我栽,要想从此过,留下买路财!现实生活中的很多场景都可以看到拦截器的“影子”,比如,我们上下班坐地铁这件事情,就好比拦截器的现实生活版。

zhuangjiaxing的博客 717

拦截器(interceptor)

*** 控制层执行器方法前的拦截器* @returnSystem . out . println("我是控制层执行器方法前的拦截器");//校验用户是否登录 HttpSession session = request . getSession();if(pname!= null) {//当前用户已经登录,放行 return true;} else {

互联网底层民工的博客 7263

Spring MVC—拦截器详解

今天就是把有关拦截器的知识做一个总结。 推荐观看 大厂面试真题集结地:阿里三面+腾讯二面+支付宝三面+拼多多二面+字节四面+淘宝五面_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com 厉害了!B站最全网络底层汇总:TCP、Sockt、三次握手、四次挥手、NIO、Epoll、多路复用(附赠源码、脑图)​www.bilibili.com 阿里资深架构师讲解最“细”的spring源码(附赠讲课资料和源码)​www.bilibili.com Java架...

小梦爱Java的博客 566

本地化部署dify,使用Database插件实现dify直连数据库报错No module named ‘MySQLdb‘解决方案

网上查阅各种资料,有说修改/dify-main/docker/volumes/sandbox/dependencies目录下的python-requirements.txt文件,添加了如下两行,试验后无效。,看到有人是其他报错,但是URI配置如下(在mysql后面加了pymysql),尝试后果真成功了。按照系统提示设置完数据库URI后保存出现错误。在工具市场查询Database,点击后进行授权。最后在该插件的项目地址获得灵感。

qiaoxu1989的博客 4333

什么是拦截器?拦截器如何配置?

今天这篇文章来介绍一下拦截器在SpringBoot中的如何自定义及如何配置的,拦截器的具体作用和应用场景。 SpringBoot版本 本文基于的Spring Boot的版本是2.6.7 。 什么是拦截器 Spring MVC中的拦截器(Interceptor)类似于ServLet中的过滤器(Filter),它主要用于拦截用户请求并作出相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。 工作原理 一个拦截器,只有preHandle方法返回true,postHandle、a.

didiplus 3762

SocraticLM: Exploring Socratic Personalized Teaching with Large Language Models

大型语言模型(LLM)被认为是推进智能教育的一项关键技术,因为它们展示了深入理解教学场景和为学生提供个性化指导的潜力。然而,当前个性化教学中基于LLM的应用主要遵循“问答”范式,学生被动地获得答案和解释。在本文中,我们提出了苏格拉底式教学模式(SocraticLM ),它实现了一种苏格拉底式的“发人深省”的教学范式,实现了真正的课堂教师的角色,让学生积极参与到真正掌握解决问题所需的思考过程中。

weixin_43961909的博客 2884

Spring MVC拦截器的定义方式和单个拦截器和多个拦截器的执行流程

**1、通常拦截器类可以通过两种方式来定义。**一种是通过实现HandlerInterceptor接口,或继承HandlerInterceptor接口的实现类(如HandlerInterceptorAdapter)来定义; 另一种是通过实现WebRequestInterceptor接口,或继承WebRequestInterceptor接口的实现类来定义。  2、单个拦截器在执行时, 程序首先会执行拦截器类中的preHandle()方法,如果该方法的返回值为true,则程序会继续向下执行处理器中的方法,否则

qq_45169180的博客 2770

Midas Civil实战避坑指南:从建模报错到施工阶段分析

本文详细解析了Midas Civil在桥梁建模与施工阶段分析中的实战避坑技巧,涵盖从基础建模到高级边界条件设置的全流程。针对截面定义、节点创建、施工荷载区分等常见问题提供专业解决方案,帮助工程师避免计算误差,提升结构分析效率。特别强调施工阶段荷载与恒荷载的正确处理,以及弹性连接的合理应用。

weixin_30319153的博客 350

基于JAVA的GB28181实现之SIP服务核心组件解析

本文深入解析了基于JAVA的GB28181标准中SIP服务的核心组件实现,包括协议栈选择、消息处理引擎、事务管理器等关键技术点。通过实战案例分享海康威视、大华设备的特殊处理技巧,并提供性能优化和常见问题排查指南,帮助开发者高效构建稳定的视频监控系统。

weixin_30892037的博客 264

Spring MVC多个拦截器(Interceptor)的执行流程(13)

Spring MVC多个拦截器(Interceptor)的执行流程多个拦截器的执行流程拦截器tesetInterCepeter1spring-config.xml测试 多个拦截器的执行流程 在 Web 应用中通常需要有多个拦截器同时工作,这时它们的 preHandle 方法将按照配置文件中拦截器的配置顺序执行,而它们的 postHandle 方法和 afterCompletion 方法则按照配置顺序的反序执行。 拦截器tesetInterCepeter1 package interCeptor; impo

zhanghw的博客 783

vuecil3+版本下,兼容ie等不支持es6的低版本浏览器

*综上,完成兼容性涉及到的配置的文件有,对应在页面中查看代码,就不单独附代码了:main.js。

yhr0322的博客 835

Spring MVC的执行流程、工作原理以及Spring MVC的拦截器

Spring MVC的执行流程、工作原理以及Spring MVC的拦截器

SuZhan0711 1399

示波器学习(一):示波器的作用、类型和基本结构

示波器的作用、使用场景;示波器的类型和基本结构介绍

qq_41300605的博客 9142

QuickFix Java 讲解(五)消息的收发与查看

本系列力求手把手教你怎样利用QuickFix Java 搭建自己的 FIX 协议收发平台,以及其中的注意事项。 所有源码的地址(免费): https://github.com/zongzhec/QuickFixPractise 这节我们讨论将Acceptor和Initiator启动以后,收到的消息极其查看方式。 6. 收发双方的通信 6.1. 启动后的通信和登录 为方便起见,这里我们使用统一的源码:https://github.com/zongzhec/QuickFixPractise ..

2247

Spring MVC的高级功能——拦截器(三)拦截器的执行流程

Spring MVC的高级功能——拦截器(三)拦截器的执行流程

致力于分享在各类技术领域的学习与实践经验,涵盖编程、虚拟化、开源工具、网络安全等。 1475

软考嵌入式 第五讲 嵌入式Linux系统技术

5.1 inittab配置文件 Linux实时操作系统开机引导时首先启动内核,由内核检查和初始化硬件设备,载入设备的驱动程序模块,安装root文件系统,然后内核将启动一个名为init的进程,它是系统运行的第一个进程,进程号为1。在init运行完成并启动其他必要的后续进程后,系统开始运行,引导过程结束。 在任何时候,可以在文件inittab中添加新的记录项。重新检查inittab文件时,可以通过命令:init q/ Q使init进程立即重新读取并处理文件inittab。 5.1.1 inittab文件记录

Leon的博客 527

Spring MVC拦截器概述、执行流程和应用例子

文章目录1 拦截器概述1.1 拦截器的定义1.2 拦截器的配置2 拦截器的执行流程2.1 单个拦截器执行顺序2.1.1 举个例子2.2 多个拦截器执行顺序2.2.1 举个例子3 应用案例-实现用户登录权限验证3.1 案例说明3.2 流程图3.3 实现代码3.3.1 User.java3.3.2 UserController.java3.3.3 LoginInterceptor.java3.3.4 配置拦截器(springmvc-config.xml)3.3.5 login.jsp3.3.6 main.js

Haa__的博客 888

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Spring MVC拦截器(一)---定义,配置及单个拦截器执行流程

文章目录前言1.拦截器的定义2.拦截器的配置3.拦截器的执行流程 前言 在实际项目中,拦截器的使用是非常普遍的,例如在购物网站中通过拦截器可以拦截未登录的用户,禁止其购买 商品,或者使用它来验证已登录用户是否有相应的操作权限等。Spring MVC中也提供了拦截器功能,通过配置即可对 请求进行拦截处理。 Spring MVC中的拦截器( Interceptor)类似于Servlet中的过滤器(Fi...

qq_44692189的博客 1946

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Spring MVC 拦截器

Spring MVC 拦截器

2301_81096101的博客 1499

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

为什么拦截器把正常请求也拦截了_Spring MVC—拦截器详解

今天就是把有关拦截器的知识做一个总结。推荐观看大厂面试真题集结地:阿里三面+腾讯二面+支付宝三面+拼多多二面+字节四面+淘宝五面_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com厉害了!B站最全网络底层汇总:TCP、Sockt、三次握手、四次挥手、NIO、Epoll、多路复用(附赠源码、脑图)​www.bilibili.com阿里资深架构师讲解最“细”的spri...

weixin_39576336的博客 596

SpringMVC拦截器执行流程解析

preHandle顺序:按注册顺序执行(I1 → I2 → I3)postHandle逆序:按注册反序执行(I3 → I2 → I1)afterCompletion逆序:按注册反序执行(I3 → I2 → I1)中断规则:任一preHandle返回false,后续拦截器都不执行当某个拦截器preHandle返回false后续拦截器的preHandle都不执行处理器不执行已执行拦截器的会执行(按逆序)postHandle方法不会执行(因为处理器未执行)执行顺序preHandle:顺序执行(1→2→3)

m0_75107803的博客 1124

Spring MVC拦截器(二)---多个拦截器执行流程及实现用户登录权限验证

前言 这篇博客属于对上一篇单个拦截器执行流程的拓展,该实验的项目所需框架包可以直接将上篇博客的项目拿来!! 1.多个拦截器的执行流程 1、在com.zsj .interceptor包中创建两个拦截器类Interceptor1 和Interceptor2 2、在配置文件springmvc-config xml中的元素内配置上面所定义的两个拦截器 3、部署和运行项目,将项目发布到Tomcat 服务器...

qq_44692189的博客 1822

day09-拦截器 +网关执行流程分析+执行链设计

1.网关执行流程分析 2.执行链设计

weixin_58678891的博客 488
上一篇: GIT的使用---如何将本地仓库提交到Github
下一篇: driver.close()和driver.quit()
一枚枫叶
博客等级 码龄9年 7粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值