Spring(1):拦截器

news2025/2/23 15:03:57

1 拦截器

拦截器是Spring中的概念,和过滤器类似,可以对用户请求进行拦截过滤处理。但是相对于过滤器而言,拦截器要的控制更加的细节,拦截器可以在三个地方进行执行:

  • 可以在请求达到Controller控制器之前,通过拦截器执行一段代码
  • 也可以在控制器执行之后,通过拦截器执行一段代码,此时只是Controller执行完毕视图还没有开始渲染
  • 最后在整个请求结束的时候还可以通过拦截器执行一段代码

使用拦截器的方法

  • 创建支持它的@Component类,它应该实现HandlerInterceptor接口
  • 实现WebMVCConfigure配置器,注册到spring容器中,添加拦截路径和放行路径

拦截器和过滤器的区别:

拦截器(Interceptor)类似于Servlet中的过滤器( Filter),它主要用于拦截用户请求并做相应的处理。

  1. 过滤器只能在容器初始化时被调用异常,在action的生命周期中,而拦截器可以多次被调用。
  2. 过滤器可以对几乎所有的请求起作用,拦截器只能对action请求起作用。
  3. 过滤器不能访问action上下文、堆栈里的对象,而拦截器可以访问。
  4. 过滤器是基于函数回调,而拦截器不依赖与servlet容器。
  5. 过滤器不能获取IOC容器中的各个bean,而拦截器可以,这点很重要,在拦截器里注入一个service,可以调用业务逻辑

拦截器是在DispatcherServlet这个servlet中执行的,因此所有的请求最先进入Filter,最后离开Filter。其顺序如下。

Filter->Interceptor.preHandle->Handler->Interceptor.postHandle->Interceptor.afterCompletion->Filter

2 实现流程

2.1 引入依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

2.2 自定义拦截器

package com.example.demo.Interceptor;

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

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

@Component
public class EasyLogControllerInterceptor implements HandlerInterceptor {

    /**
     * 在controller调用之前执行
     */
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        System.out.println(request.getRequestURI()+"开始执行");
        return true;
    }

    /**
     * 在controller调用中执行
     */
    public void postHandle(
            HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
            throws Exception {
        System.out.println(request.getRequestURI()+"执行中");
    }

    /**
     * 在controller调用后执行
     */
    public void afterCompletion(
            HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println(request.getRequestURI()+"执行结束");
    }

}

2.3 注入适配器

package com.example.demo.Interceptor;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class IntercepterConfig implements WebMvcConfigurer {

    @Autowired
    private EasyLogControllerInterceptor easyLogControllerInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //addPathPatterns用于添加拦截路径
        //excludePathPatterns用于添加不拦截的路径
        registry.addInterceptor(easyLogControllerInterceptor).addPathPatterns("/hello");

    }

    //此方法用于配置静态资源路径
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("classpath:/my/");
    }

}

执行结果如下:

访问hello接口时,会进入拦截器, 其他的接口不会进入。

3 控制器验证

多个拦截器顺序

  • 多个拦截器的执行顺序和注册的顺序有关,先注册的先执行
  • 可以通过Order方法来设置执行顺序,值越小越先执行

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

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

相关文章

VirtualBox 客户机/虚拟机无法时间同步?可能是你安装客户机插件的方式不对!

文章目录安装客户机插件的正确方式准备工作安装过程用户手册中的“客户机插件”安装客户机插件的正确方式 准备工作 所需包如下&#xff1a; GNU compiler (GCC)GNU Make (make)Kernel header fileslib* files 笔者亲测使用的 CentOS 7 Linux 内核版本为 3.10.0-1160.81.1.…

SQL索引概念(详解B+树)

SQL索引定义分类复合索引特性复合索引最左特性&#xff08;原则&#xff09;原理索引及其扫描类型索引的优缺点优点:缺点:索引工作原理BTree索引怎么判断是否创建索引&#xff1f;为什么Mysql用B树做索引而不用B-树或红黑树为什么索引快&#xff1f;定义 索引是一种排好序的快…

【数据结构】认清带头双向循环链表的庐山真面目

目录前言一、带头双向循环链表的介绍二、带头双向循环链表的类型重定义1.对数据类型进行重定义2.链表结点结构3.结点类型重定义三、常见函数操作的实现1.声明2.定义1. 申请新节点2. 初始化3. 销毁链表4. 打印链表5. 尾插数据6. 尾删数据7. 头插结点8.头删结点9. 在指定的位置前…

嵌入式开发的程序架构

前言 在嵌入式软件开发&#xff0c;包括单片机开发中&#xff0c;软件架构对于开发人员是一个必须认真考虑的问题。 软件架构对于系统整体的稳定性和可靠性是非常重要的&#xff0c;一个合适的软件架构不仅结构清晰&#xff0c;并且便于开发。 我相信在嵌入式或单片机软件开发…

聚焦云原生安全|安全狗亮相云原生产业联盟年会

1月9日&#xff0c;云原生产业联盟年会成功举办。 作为国内云原生安全领导厂商&#xff0c;安全狗也受邀参与此次大会。 安全狗高级副总裁陈荣有发表寄语 在此次线上会议中&#xff0c;安全狗凭借突出的云原生安全整体实力&#xff0c;通过层层筛选与审核&#xff0c;入选成为…

OpenCV从3D-2D 点对应中查找对象姿势solvePnP

1.概述&#xff1a;在使用相机拍照片时&#xff0c;大多数人会考虑拍的好不好看&#xff0c;关注相机中物体坐标的并不多&#xff0c;但是对于地信学科来说&#xff0c;如果能从照片中获取物体的真实位置&#xff0c;对地理信息获取大有帮助&#xff0c;在这里面&#xff0c;十…

深入分析Linux PCI驱动框架(三)

说明&#xff1a; Kernel版本&#xff1a;4.14ARM64处理器使用工具&#xff1a;Source Insight 3.5&#xff0c; Visio 1. 概述 先回顾一下PCIe的架构图&#xff1a; 本文将讲PCIe Host的驱动&#xff0c;对应为Root Complex部分&#xff0c;相当于PCI的Host Bridge部分&…

Vue 总结四 (ref, mixin, 插件, 插槽, VueX)

目录 ref 混入 mixin 插件 插槽 使用插槽的情景 使用方法 VueX 使用场景 使用 state 存放共享数据 actions 操作共享数据的API mutations 操作共享数据的API 生命周期图 ref 和id的区别 对于传统标签来说没有区别 都拿到的是 html内容 对于自定义的vue 的标签…

Spring事务源码分析

1. 前言 Spring支持两种事务管理的方式&#xff1a;声明式事务和编程式事务。编程式事务的优点是可以在代码里控制事务的粒度&#xff0c;实现细粒度的事务控制&#xff0c;缺点是对业务代码存在侵入性&#xff0c;代码复杂度较高&#xff0c;一般很少使用。声明式事务的优点是…

Linux下的动静态库

目录 认识动静态库 如何制作动静态库&#xff1f; 静态库 动态库 使用库 使用静态库 使用动态库 为什么动态链接是如此呢&#xff1f; 认识动静态库 我们在使用标准库的时候&#xff0c;需要有系统的头文件和系统的库文件&#xff0c;这个库文件是什么呢&#xff1f; …

Databend 借助对象存储帮你实现降本增效

本篇文章围绕着&#xff1a; 什么是对象存储当 Databend 遇到对象存储2022 年 Databend 利用对象存储降本的案例国内优秀的对象存储产品基于对象存储创业的产品 什么是对象存储 对象存储是一种可以非结构化存储和管理数据的技术。 可以简单理解为 NoSQL 接口方式存储和访问数…

linux系统中使用QT实现多媒体的功能方法

大家好&#xff0c;今天主要和大家聊一聊&#xff0c;如何使用QT中的多媒体的功能。 目录 第一&#xff1a;多媒体基本简介 第二&#xff1a;应用实例实现 第三&#xff1a;程序运行效果 第一&#xff1a;多媒体基本简介 QT的多媒体模块提供了音频&#xff0c;视频&#xff…

分布式系统-CAP 理论

在前一篇分布式系统–拜占庭将军问题(The Byzantine Generals Problem) 我们理解了共识问题的背景&#xff0c;这一节主要讨论如何解决或者理解自己系统中的共识问题&#xff0c;通过什么来分辨自己的系统需要哪一种共识。 这个理论就是 CAP 理论&#xff0c;先想下面几个问题…

linux 线程详解

前言 程序运行在内存空间中叫进程&#xff0c;进程中包含有若干线程&#xff0c;线程是系统调度和执行的基本单位。线程才是程序运行的实体&#xff0c;通常程序里的main()函数就相当于主线程&#xff0c;把进程理解成一个容器&#xff0c;里面可以包含有若干线程和若干资源&am…

6)Mybatis启动流程

1. 首先Mybatis会加载配置文件mybatis-config.xml&#xff0c; 主要实现在Mybatis的builder模块&#xff0c;包路径org.apache.ibatis.builder&#xff0c;解析入口XMLConfigBuilder private void settingsElement(Properties props) {configuration.setAutoMappingBehavior(Au…

指针进阶篇(2)

进阶指针 &#x1f914;前言&#x1f914; 一、&#x1f60a;函数指针&#x1f60a; 二、&#x1f61c;函数指针数组&#x1f61c; 三 、&#x1f61d;指向函数指针数组的指针&#x1f61d; 四、&#x1f31d;回调函数&#x1f31d; &#x1f340;小结&#x1f340; &…

摩丝-题解

看到题目&#xff0c;怀疑是莫尔斯电码&#xff0c;打开发现果然是莫尔斯电码的点和划.. .-.. --- ...- . -.-- --- ..-简单说一下电报的原理最简单的电报模型就是一个电源&#xff0c;一个开关和一个电磁铁当需要长距离使用时候&#xff0c;需要用到继电器按下开关&#xff0c…

【BP靶场portswigger-服务端10】XML外部实体注入(XXE注入)-9个实验(全)

前言&#xff1a; 介绍&#xff1a; 博主&#xff1a;网络安全领域狂热爱好者&#xff08;承诺在CSDN永久无偿分享文章&#xff09;。 殊荣&#xff1a;CSDN网络安全领域优质创作者&#xff0c;2022年双十一业务安全保卫战-某厂第一名&#xff0c;某厂特邀数字业务安全研究员&…

C#【必备技能篇】使用NPOI实现对excel的读取和写入

文章目录1、Winform界面布局2、引用NPOI的dll3、源码4、运行效果5、NPOI的dll下载地址6、补充【以上步骤只能打开.xls文件&#xff08;97-2003版本&#xff09;&#xff0c;打不开.xlsx文件&#xff08;2007版本&#xff09;】1、Winform界面布局 2、引用NPOI的dll 3、源码 us…

(十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置

前言 本节内容我们主要介绍一下在jenkins中如何集成sonar qube代码质量检查工具&#xff0c;sonar qube可以在流水化项目集成部署前对我们的代码质量检查。开始本节内容前我们需要先搭建好sonar qube服务&#xff0c;关于sonar qube服务的搭建可参考作者往期博客内容&#xff…