当前位置: 首页 > 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 
http://www.lryc.cn/news/449113.html

相关文章:

  • ACM第三次考核题解
  • 基于Vue3内置的lodash函数库实现防抖节流
  • ls -a有什么作用
  • LLM - 使用 RAG (检索增强生成) 多路召回 实现 精准知识问答 教程
  • 编程语言图书创作要注意的事情有哪些?
  • 主流高级编程语言的推出时间及年份
  • qt 模仿简易的软狗实现
  • 荣业食品销售费用每年上亿元:主要产品收入大降,电商占比过低
  • 数据结构:并查集
  • 微信小程序实战教程:轻松实现列表批量选择功能
  • 企业微信:开启客户联系和配置
  • Python发送邮件教程:如何实现自动化发信?
  • 一周热门|苏姿丰:芯片行业不能只盯着 GPU;Gartner:GenAI 即将越过期望膨胀期
  • Failed to load WebView provider: No WebView installed
  • java日志框架之Log4j
  • C++ bitset(位图)的模拟实现
  • Llama 3.2:利用开放、可定制的模型实现边缘人工智能和视觉革命
  • 解决R语言bug ‘sh‘ is not recognized as an internal or external command
  • 记一次Mac 匪夷所思终端常用网络命令恢复记录
  • 2024最新!!Java后端面试题(4)看这一篇就够了!!!!
  • springboot整合sentinel和对feign熔断降级
  • 遗传算法与深度学习实战——使用进化策略实现EvoLisa
  • HttpServletRequest简介
  • c++开发之编译curl(安卓版本)
  • QT+ESP8266+STM32项目构建三部曲三--QT从环境配置到源程序的解析
  • Web APIs 5:Window对象(BOM)+本地存储
  • 神经网络(四):UNet图像分割网络
  • Java 编码系列:注解处理器详解与面试题解析
  • C语言 | Leetcode C语言题解之第441题排列硬币
  • Linux noVNC远程桌面(xfce)部署