当前位置: 首页 > news >正文

Spring Boot 进阶- Spring Boot 自定义拦截器详解

在这里插入图片描述
  上篇文章中我们创建了一个RestFul风格的接口,并且介绍了如何对其结果进行格式化的方式。这篇文章我们来讲在SpringMVC中常用到的另一个概念拦截器。

什么是拦截器?

  在Spring MVC中拦截器有点类似于在Servlet中的过滤器的概念,主要是用来拦截用户求,并且对用户请求进行相应的前置处理。例如鉴权、请求记录、日志处理、判断用户是否登录等等。那么在Spring Boot中如何来实现一个自定义的拦截器呢?

实现自定义拦截器

  如何自定义一个拦截器,首先我们知道在SpringMVC中有一个接口HandlerInterceptor,继承这个接口我们就可是实现一个自定义的拦截器。其源码如下

public interface HandlerInterceptor {default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {return true;}default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,@Nullable ModelAndView modelAndView) throws Exception {}default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,@Nullable Exception ex) throws Exception {}}

  会看到在这个接口中有三个方法如下

  • preHandler()方法:这个方法在控制器方法之前执行,这个方法返回一个布尔值,如果其返回值为ture的时候,标识可以继续往下执行后续的操作;如果返回false的时候,就会中断后续所有的操作,包括调用下一个拦截器或者控制器类中的方法执行等等。
  • postHandler()方法:这个方法会在调用控制器方法之后调用,在解析视图层之前调用,通过这个方法可以对请求中和视图模型中的内容进行修改。
  • afterCompletion()方法:这个方法会在整个的请求完成之后进行调用,也就是完成视图层渲染之后进行调用。主要用来记录一些用户的操作日志,完成一些资源清理的任务。

  下面我们就来通过一个小例子来看一下如何使用拦截器

防止重复提交拦截器

  在实际开发中,我们会遇到网络或者系统不稳定的情况,这个时候我们在页面上点击完提交按钮之后,系统并没有正常的返回提交成功,而用户接收不到提交成功的信号就会认为没有提交,就会重复点击提交按钮,造成在数据库中存在多个相同数据的情况。这个时候我们就可以通过拦截器来解决这种问题。

  代码如下,我们通过实现HandlerInterceptor接口来实现一个防止重复提交的拦截器。前面提到的,preHandle()方法的返回值会影响后续的调用,所以可以通过实现这个方法来控制拦截器是否执行后续的操作。

@Component
public abstract 

相关文章:

  • Go版数据结构 -【4.2 二叉搜索树】
  • 从零开始Ubuntu24.04上Docker构建自动化部署(五)Docker安装jenkins
  • Linux系统性能调优技巧:提升效率与响应速度的秘诀
  • uni-app在线预览pdf
  • LeetCode 704. 二分查找
  • attrs:Python的类装饰器(简化类定义)
  • 华为-单臂路由
  • 怎样将多个视频合并成一个?7种无损视频合并技巧,1分钟剪辑出大片!
  • 腾讯邮箱上传附件卡、慢、无法上传,下载慢问题处理
  • Unity图形用户界面!*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。(万字解析)
  • Tableau数据可视化入门
  • 一款辅助渗透测试过程,让渗透测试报告一键生成
  • UI设计师面试整理-面向用户的设计
  • 从碎片到整合:EasyCVR平台如何重塑城市感知系统的视频数据生态
  • 一文说透RTMP、RTSP、RTP、HLS、MPEG-DASH
  • 【comparator, comparable】小总结
  • 30天自制操作系统-2
  • CAP理论的例子讲解
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • JavaScript设计模式系列一:工厂模式
  • js
  • JSONP原理
  • JS变量作用域
  • js作用域和this的理解
  • LeetCode18.四数之和 JavaScript
  • Spring框架之我见(三)——IOC、AOP
  • vue数据传递--我有特殊的实现技巧
  • 第十八天-企业应用架构模式-基本模式
  • 分布式事物理论与实践
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 目录与文件属性:编写ls
  • 排序(1):冒泡排序
  • 区块链技术特点之去中心化特性
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • MPAndroidChart 教程:Y轴 YAxis
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​Benvista PhotoZoom Pro 9.0.4新功能介绍
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • $.ajax,axios,fetch三种ajax请求的区别
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (Oracle)SQL优化基础(三):看懂执行计划顺序
  • (Windows环境)FFMPEG编译,包含编译x264以及x265
  • (八)Flask之app.route装饰器函数的参数
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (黑马点评)二、短信登录功能实现
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (转)Sql Server 保留几位小数的两种做法
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .Net 基于.Net8开发的一个Asp.Net Core Webapi小型易用框架