SpringMVC 拦截器详解

news2024/9/23 5:27:09

目录

一、介绍

二、过滤器与拦截器的简单对比

三、自定义拦截器

四、注册拦截器

五、案例演示-登录拦截器

5.1 自定义拦截器

5.2 注册拦截器


如果能帮到你将是我的荣幸❣️

 一、介绍

  • SpringMVC提供的拦截器类似于JavaWeb中的过滤器,只不过SpringMVC拦截器只拦截被前端控制器拦截的请求,即拦截控制器方法的执行,而过滤器拦截从前端发送的任意请求。

  • 熟练掌握SpringMVC拦截器对于我们开发非常有帮助,在没使用权限框架(shiro,spring security)之前,一般使用拦截器进行认证和授权操作。

  • SpringMVC拦截器有许多应用场景,比如:登录认证拦截器,字符过滤拦截器,日志操作拦截器等等。

二、过滤器与拦截器的简单对比

过滤器

  • 依赖于servlet容器
  • 在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。
  • 使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等。

拦截器

  • 依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架
  • 在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。
  • 由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。
  • 但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理

三、自定义拦截器

SpringMVC拦截器的实现一般有两种方式:

  • 自定义的Interceptor类要实现了Spring的HandlerInterceptor接口

  • 继承实现了HandlerInterceptor接口的类,比如Spring已经提供的实现了HandlerInterceptor接口的抽象类HandlerInterceptorAdapter。

public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {}

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {}
}

HandlerInterceptor接口中定义了三个方法,我们就是通过这三个方法来对用户的请求进行拦截处理的。

  • preHandle(): 这个方法在Controller处理请求之前被调用,SpringMVC中的Interceptor是链式调用的,在一个应用中或者说是在一个请求中可以同时存在多个Interceptor 。每个Interceptor的调用会依据它的声明顺序依次执行,而且最先执行的都是Interceptor 中的preHandle方法,所以可以在这个方法中进行一些前置初始化操作或者是对当前请求的一个预处理,也可以在这个方法中进行一些判断来决定请求是否要继续进行下去。

    该方法的返回值是布尔值Boolean 类型的:

    • 当它返回为false 时,表示请求结束,后续的Interceptor和Controller都不会再执行

    • 当返回值为true时就会继续调用下一个Interceptor的preHandle 方法,如果已经是最后一个Interceptor的时候就会是调用当前请求的Controller方法。

  • postHandle():这个方法在Controller方法处理当前请求之后执行,但是它会在DispatcherServlet进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller处理之后的ModelAndView对象进行操作。

    • postHandle方法被调用的方向跟preHandle 是相反的,也就是说先声明的Interceptor的postHandle方法反而会后执行。

  • afterCompletion():这个方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行。顾名思义,该方法将在整个请求结束之后,也就是在DispatcherServlet渲染了对应的视图之后执行。这个方法的主要作用是用于进行资源清理工作的。

拦截器流程图

单个拦截器执行流程图  

 多个拦截器执行流程图

我们可以配置多个拦截器,每个拦截器中都有三个方法。总结多个拦截器中的方法执行规律如下:

  • preHandle:Controller方法处理请求前执行,根据拦截器定义的顺序,正向执行

  • postHandle:Controller方法处理请求后执行,根据拦截器定义的顺序,逆向执行。需要所有的preHandle方法都返回true时才会调用。

  • afterCompletion:View视图渲染后处理方法:根据拦截器定义的顺序,逆向执行。preHandle返回true就会调用。

四、注册拦截器

自定义拦截器规则编写完成后,还不行,还需要写配置文件,或者配置类。

目的是让我们的拦截器知道,哪些控制器方法的访问需要执行拦截器,哪些不需要执行。

如今主流的都是springboot框架,我们就不需要写配置文件了,直接编写一个配置类搞定。

  • 配置类需要实现WebMvcConfigurer接口,或者继承它的实现类WebMvcConfigurerAdapter

  • 然后重写里面的addInterceptors添加拦截器方法,具体需要添加哪个拦截器,拦截哪些路径,不拦截哪些路径,都在这里配置。

五、案例演示-登录拦截器

接下来编写一个登录拦截器,这个拦截器可以实现认证操作。就是当我们还没有登录的时候,如果发送请求访问我们系统资源时,拦截器不放行,请求失败。只有登录成功后,拦截器放行,请求成功。登录拦截器只要在preHandle()方法中编写认证逻辑即可,因为是在请求执行前拦截。代码实现如下:

5.1 自定义拦截器

/**
 *  登录拦截器
 */
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        Object user = request.getSession().getAttribute("user");
        if (user == null){
            log.info("当前无用户登录,拦截此次请求");
            response.setHeader("content-type","text/html;charset=UTF-8");//指定编码,防止乱码
            response.getWriter().write(JSON.toJSONString(Result.fail(50004,"当前无用户登录,无法访问")));
            return false;
        }else {
            log.info("当前{} 号用户已登录,放行",user);
            return true;
        }
    }
}

5.2 注册拦截器

@Configuration
public class WebMVCConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor())
            	.addPathPatterns("/**") // 对所有的路径都进行拦截
                .excludePathPatterns("/common/login");
    }
}

说明:

.addPathPatterns("/**")   对所有的路径都进行拦截
.excludePathPatterns("/common/login","/swagger-ui.html/*");  对这两条路径进行了放行,前提是这两个路径要存在对应的控制器方法。否则一旦被添加到addPathPatterns中的路径拦截到了,即使excludePathPatterns方法放行了,也无法放行。

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

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

相关文章

火山引擎VeDI最新分享:消费行业的数据飞轮从“四更”开始

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 数据飞轮,正在为消费行业的数字化升级提供一套全新模式。 在刚刚结束的《全链路增长:数据飞轮转动消费新生力》专场活动上,火山引…

事务隔离:为什么你改了我还看不见

前提概要 你肯定不陌生,和数据库打交道的时候,我们总是会用到事务。最经典的例子就 是转账,你要给朋友小王转 100 块钱,而此时你的银行卡只有 100 块钱。 转账过程具体到程序里会有一系列的操作,比如查询余额、做加减法…

第五章 Scala 变量与运算符

1 变量 变量是一种使用方便的占位符,用于引用计算机内存地址,变量创建后会占用一定的内存空间。基于变量的数据类型,操作系统会进行内存分配并且决定什么将被储存在保留内存中。因此,通过给变量分配不同的数据类型,你…

MyBatis查询数据库入门学习<一>

目录 1.MyBatis 是什么? MyBatis官网:mybatis – MyBatis 3 | 简介 2.为什么要学习 MyBatis? 3.怎么学MyBatis? 4.第⼀个MyBatis查询 4.1 创建数据库和表 4.2 添加MyBatis框架⽀持 4.2.1 ⽼项⽬添加MyBatis 4.2.2 新项⽬添…

Git时间:版本控制工具进阶

Git时间:版本控制工具进阶 忽略文件 Git允许用户将指定的文件或目录排除在版本控制之外,它会检查代码仓库的目录下是否存在一个名为.gitignore的文件,如果存在,就去一行行读取这个文件中的内容,并把每一行指定的文件…

Matlab的SimuLink对FS32K144编程--SPI通讯控制12bitDAC输出

​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ 1、硬件介绍,DAC芯片:AD5328BRUZ DAC_SPI_SCK----PTD0(SPI1) DAC_SPI_DIN----PTE0(SPI1)单片…

Android 之 使用 SoundPool 播放音效

本节引言: 第九章给大家带来的是Android中的多媒体开发,与其说是多媒体开发还不如是多媒体相关API的 的使用,说下实际开发中我们做了一些和多媒体搭边的东西:拍照,录音,播放音乐,播放视频... 嗯…

stable-diffusion-webui汉化教程

第一种方法 1.打开stable diffusion webui,进入"Extensions"选项卡 2.点击"Install from URL" 3、注意"URL for extension’s git repository"下方的输入框 4、填入地址:https://github.com/VinsonLaro/stable-diffus…

让企业出海支付流程更加安全,亚马逊云科技推出支付加密服务

在咖啡店买一杯咖啡,在电商平台下单一件商品,其消费流程背后,都要涉及到金融支付的多个环节,而其中对金融数据存储和流通的加密则是保障金融安全的重要环节。 加密是保障消费者支付流程安全的最大挑战。亚马逊云科技首席安全布道…

医学案例|ROC曲线

一、案例介绍 研究者想要进行“糖化血蛋白”的研究,对糖尿病患者和非糖尿病患者各100名检测糖化血红蛋白(HbAlc)含量,希望可以研究糖化血蛋白对患有糖尿病的情况是否有诊断价值,如果有最佳的诊断界值是多少。 二、问…

MQ, RocketMQ, 安装

文章说明 本文主要说明RocketMQ的几种常见的安装方式。之前在工作中也用过RocketMQ,但是一直用的是测试环境上的,也没有自己动手安装过。这次专门抽了时间学习了一下。 文章目录 文章说明参考文献安装windows安装环境要求下载配置环境变量启动注意事项 …

OJ练习第146题——杨辉三角 II

力扣链接:119. 杨辉三角 II 题目描述 给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 Java代码(直接法) class Solution {/*** 获取…

程序员自由创业周记#4:从一笔30美元的收入谈起

程序员自由创业周记#4:从一笔30美元的收入谈起 pexels-freestocksorg-127713 本文是一位程序员进行独立开发创业的记录,将分享创业过程中的所思所想以及收支明细。在文末,您还可以找到之前的历史文章。 惊喜之旅 这次的惊喜源于 学伟扫描Pro …

初探webAssembly | 京东物流技术团队

1 WebAssembly是什么? 一种运行在现代网络浏览器中的新型代码,并且提供新的性能特性和效果 W3C WebAssembly Community Group开发的一项网络标准,对于浏览器而言,WebAssembly 提供了一条途径,让各种语言编写的代码以接…

AXI协议之AXILite开发设计(三)

微信公众号上线,搜索公众号小灰灰的FPGA,关注可获取相关源码,定期更新有关FPGA的项目以及开源项目源码,包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 三、xilinx的AXILite的ip组件生成及…

智能RFID追溯系统优化空调装配效能

智能RFID追溯系统优化空调装配效能 空调作为现代家庭和工业建筑中必备的设备,其装配过程对生产效率和质量至关重要。传统的装配方式往往依赖于人工操作,存在一定的人为失误和效率低下的问题。而RFID技术的应用能够为空调装配带来一系列的优势。 RFID技…

景区如何对旅行社进行分销管理?

旅行社的买票能力强,一般景区会跟多家旅行社合作门票分销。其中卖票下单、价格设定、财务对账结算都出现了很多问题,导致对账困难,查询困难,甚至可能有偷票漏票的情况出现,给景区收入造成损失。那要怎么处理呢&#xf…

C#..上位机软件的未来是什么?

C#是一种流行的编程语言,广泛应用于桌面应用程序和上位机软件开发。未来,C#上位机软件将继续不断发展和创新,以满足用户日益增长的需求。以下是我认为C#上位机软件未来可能会涉及的一些方向: 更加智能化:随着人工智能…

全面防护!Fortinet发布混合式部署防火墙HMF

在企业IT复杂性日益增长、网络安全威胁日趋紧迫、网络安全设施可维护性逐渐降低的背景下,企业迫切寻求可无缝跨越所有IT区域,有效简化企业防护架构的统一解决方案。近日, Fortinet Accelerate 2023中国区15城巡展圆满落幕,在收官之…

CentOS 项目发出一篇奇怪的博文

导读最近,在红帽限制其 RHEL 源代码的访问之后,整个社区围绕这件事发生了很多事情。 CentOS 项目发出一篇奇怪的博文 周五,CentOS 项目董事会发出了一篇模糊不清的简短博文,文中称,“发展社区并让人们更容易做出贡献…