拦截器(HandlerInterceptor)

article/2025/10/20 11:20:16

目录

1 什么是拦截器

2 HandlerInterceptor和WebMvcConfigurer

2.1 HandlerInterceptor

2.2 WebMvcConfigurer

3 拦截器实现流程


1 什么是拦截器

拦截器是相对于Spring中来说的,它和过滤器不一样,过滤器的范围更广一些是相对于Tomcat容器来说的。拦截器可以对用户进行拦截过滤处理。

但是并不是说拦截器只对请求进入Controller控制器之前起作用,它也分为3个部分:

  • 请求进入Controller之前,通过拦截器执行代码逻辑
  • Controller执行之后(只是Controller执行完毕,视图还没有开始渲染),通过拦截器执行代码逻辑
  • Controller完全执行完毕(整个请求全部结束),通过拦截器执行代码逻辑

HandlerInterceptor和WebMvcConfigurer

想要自己配置一个拦截器,就必须用到HandlerInterceptor和WebMvcConfigurer这两个接口。

2.1 HandlerInterceptor

作用:自定义拦截器

如何创建:这个接口我们通常会自定义一个类。加上@Component注解,并且使它实现HandlerInterceptor接口(根据需求重写里面的三个方法)

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 {}
}
  • preHandle:此方法的作用是在请求进入到Controller进行拦截,有返回值。(返回true则将请求放行进入Controller控制层,false则请求结束返回错误信息)

用法:登录验证(判断用户是否登录)权限验证:判断用户是否有权访问资源(校验token)

  • postHandle:该方法是在Controller控制器执行完成但是还没有返回模板进行渲染拦截。没有返回值。就是Controller----->拦截------>ModelAndView。

用法:因此我们可以将Controller层返回来的参数进行一些修改,它就包含在ModelAndView中,所以该方法多了一个ModelAndView参数。

  • afterCompletion:该方法是在ModelAndView返回给前端渲染后执行。

用法:例如登录的时候,我们经常把用户信息放到ThreadLocal中,为了防止内存泄漏,就需要将其remove掉,该操作就是在这里执行的。

2.2 WebMvcConfigurer

作用:添加拦截规则

如何创建:自定义一个类,实现WebMvcConfigurer并将它注入到Spring容器中。根据需求实现里面方法。

WebMvcConfigurer源码如下

public interface WebMvcConfigurer {default void configurePathMatch(PathMatchConfigurer configurer) {}default void configureContentNegotiation(ContentNegotiationConfigurer configurer) {}default void configureAsyncSupport(AsyncSupportConfigurer configurer) {}default void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {}default void addFormatters(FormatterRegistry registry) {}default void addInterceptors(InterceptorRegistry registry) {}default void addResourceHandlers(ResourceHandlerRegistry registry) {}default void addCorsMappings(CorsRegistry registry) {}default void addViewControllers(ViewControllerRegistry registry) {}default void configureViewResolvers(ViewResolverRegistry registry) {}default void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {}default void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {}default void configureMessageConverters(List<HttpMessageConverter<?>> converters) {}default void extendMessageConverters(List<HttpMessageConverter<?>> converters) {}default void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {}default void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {}@Nullabledefault Validator getValidator() {return null;}@Nullabledefault MessageCodesResolver getMessageCodesResolver() {return null;}
}

根据源码发现,这里面有很多方法,但是通常我们只用到了里面的两种方法如下:

addInterceptors:添加拦截器,拦截器需要拦截的路径和需要排除拦截的路径都需要在其中配置

addResourceHandlers:配置静态资源路径,即某些请求需要读取某个路径下的静态资源内容,需要配置该静态资源的路径,通过该方法可以统一给这些请求配置指定静态资源路径

3 拦截器实现流程

根据第二部分,我们知道了配置拦截器的准备工作。

1)自定义类实现HandlerInterceptor

@Component
public class HeaderInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("进入拦截器=======执行前========");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("进入拦截器=======执行中========");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("进入拦截器=======执行后========");}
}

2)自定义类实现WebMvcConfigurer

package com.liubujun.springbootinterceptor.config;import com.liubujun.springbootinterceptor.interceptor.HeaderInterceptor;
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.WebMvcConfigurationSupport;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;/*** @Author: liubujun* @Date: 2022/10/10 19:55*//*** 此处也可以继承WebMvcConfigurationSupport*/
@Configuration
public class WebAppConfig implements WebMvcConfigurer {@Resourceprivate HeaderInterceptor headerInterceptor;/*** 添加拦截规则* @param registry*/@Overridepublic void addInterceptors(InterceptorRegistry registry) {List<String> patterns = new ArrayList<>();patterns.add("/login/login");registry.addInterceptor(headerInterceptor).addPathPatterns("/**") //所有的请求都要拦截。.excludePathPatterns(patterns); //将不需要拦截的接口请求排除在外}/*** //下面代码意思是:配置一个拦截器,如果访问路径时addResourceHandler中的这个路径(我这里是/**表示所有的路径),*  那么就映射到访问本地的addResourceLocations这个路径上,这样就可以看到该路径上的资源了* @param registry*/@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/**") //配置需要添加静态资源请求的url.addResourceLocations("classpath:/pic/"); //配置静态资源路径}
}

3)测试类

@RestController
public class LoginController {@GetMapping("/login/login")public String testLoginInterceptor(){return "登录请求没有被拦截====》看控制台没有输出";}@GetMapping("/test/other")public String testOtherInterceptor(){return "该请求没有被拦截,看控制台有输出";}
}

4)本地添加静态资源

猜验证1:

        由于在配置拦截规则中,拦截了所有请求,但是排除了登录请求,所以

/login/login 请求正常访问,但不会进入拦截器,故控制台不会打印拦截器中的输出语句。

 

 验证2:

        由于在配置拦截规则中,拦截了所有请求,但是排除了登录请求,所以

/test/other请求正常访问,会进入拦截器,控制台会打印拦截器中的输出语句。

 验证3:拦截器中配置了映射静态资源路径,所以可以访问到自己上传到本地服务器的图片。

以上验证全部正确。 

参考博客:SpringBoot自定义拦截器interceptor使用详解_Fly丶X的博客-CSDN博客


http://chatgpt.dhexx.cn/article/DgIjrHxI.shtml

相关文章

用 Java 实现拦截器 Interceptor 的拦截功能

Java 里的拦截器是动态拦截 action 调用的对象&#xff0c;它提供了一种机制可以使开发者可以定义在一个 action 执行的前后执行的代码&#xff0c;也可以在一个 action 执行前阻止其执行&#xff0c;同时也提供了一种可以提取 action 中可重用部分的方式。在 AOP&#xff08;A…

java-拦截器

(1)浏览器发送一个请求会先到Tomcat的web服务器 (2)Tomcat服务器接收到请求以后&#xff0c;会去判断请求的是静态资源还是动态资源 (3)如果是静态资源&#xff0c;会直接到Tomcat的项目部署目录下去直接访问 (4)如果是动态资源&#xff0c;就需要交给项目的后台代码进行处理…

JAVA中的拦截器、过滤器

JAVA变成拦截器、过滤器 一、拦截器1、简介说明2、源码及方法说明3、拦截器自定义应用 二、过滤器1、简介说明2、源码及方法说明3、过滤器的自定义应用 三、Springboot中的WebMvcConfigurer1、简介2、主要方法3、添加拦截器 四、区别1、原理2、触发3、其他 一、拦截器 1、简介…

Java开发学习----拦截器(Interceptor)详细解析

一、拦截器概念 讲解拦截器的概念之前&#xff0c;我们先看一张图: (1)浏览器发送一个请求会先到Tomcat的web服务器 (2)Tomcat服务器接收到请求以后&#xff0c;会去判断请求的是静态资源还是动态资源 (3)如果是静态资源&#xff0c;会直接到Tomcat的项目部署目录下去直接访…

JAVA三大器之拦截器

1&#xff0c;拦截器的概念 java里的拦截器是动态拦截Action调用的对象&#xff0c;它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码&#xff0c;也可以在一个Action 执行前阻止其执行&#xff0c;同时也提供了一种可以提取Action中可重用部分代码的方式。…

java之拦截器

java里的拦截器是动态 拦截action的web请求&#xff0c;而过滤器能够进行系统级别的过滤&#xff0c;即能够过滤所有的web请求。从这可以看出拦截器是有一定的局限性的。拦截器是基于jdk实现的动态代理&#xff0c;拦截器是动态拦截action调用的对象&#xff0c; 拦截器可以使得…

Java三大器之拦截器(Interceptor)的实现原理及代码示例

前言&#xff1a;前面2篇博客&#xff0c;我们分析了Java中过滤器和监听器的实现原理&#xff0c;今天我们来看看拦截器。 1&#xff0c;拦截器的概念 java里的拦截器是动态拦截Action调用的对象&#xff0c;它提供了一种机制可以使开发者在一个Action执行的前后执行一段代…

Java 拦截器

一、引言 既然要用拦截器&#xff0c;首先先得简单了解一下什么是拦截器&#xff1a; 概念&#xff1a;java里的拦截器是动态拦截Action调用的对象&#xff0c;它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码&#xff0c;也可以在一个Action执行前阻止其执行…

VirtualAPK:滴滴 Android 插件化的实践之路

作者简介&#xff1a; 任玉刚&#xff0c;滴滴出行 Android 技术专家&#xff0c;《Android 开发艺术探索》作者&#xff0c;插件化框架 dynamic-load-apk 的发起者&#xff0c;CSDN 移动开发博客专家&#xff0c;曾当选 CSDN 2014、2015年度十大博客之星。热爱技术&#xff0c…

Unity刚体

1、Dynamic&#xff1a;动态类型 受重力和力的影响移动和旋转 Material&#xff1a; 物理材质&#xff0c;在刚体上设置了物理材质&#xff0c;如果子物体有碰撞器但是没有设置材质则会通用刚体的物理材质 如果不设置&#xff0c;将使用在Physics 2D窗口中设置的默认材质(Physi…

android view 的测量过程

参考任玉刚主席的《android开发艺术探索》所写。

2017年终总结,开始写博客的第一年

结束校园生活&#xff0c;开始工作 今年是我开始工作的第一年&#xff0c;前半个学期实习阶段&#xff0c;开发了三个上线的应用&#xff0c;之前在学校的时候&#xff0c;做过不少练手的项目&#xff0c;有时心血来潮&#xff0c;还做了一些自己认为有趣的项目&#xff0c;但是…

阿里组织新调整:张勇兼任云业务总裁“敏捷组织”是内核

雷递网 雷建平 12月29日 岁末年初之际&#xff0c;在小米进行管理层调整后&#xff0c;阿里巴巴也进行了新一轮调整。 12月29日&#xff0c;阿里巴巴集团董事会主席兼CEO张勇发布内部邮件&#xff0c;宣布张建锋不再担任阿里云总裁&#xff0c;继续担任阿里达摩院院长&#xff…

鲲鹏院武志强课题组诚聘博士后

诚聘英才 Recruitment Season 佛山鲲鹏现代农业研究院 研究院简介 佛山鲲鹏现代农业研究院&#xff08;以下简称“鲲鹏院”&#xff09;成立于2021年&#xff0c;由中国农业科学院与佛山市人民政府、南海区人民政府依托中国农业科学院&#xff08;深圳&#xff09;农业基因组研…

刚体

概述 在整个 Unity 物理系统中&#xff0c;最重要概念就是刚体 Rigidbody。 刚体是物理学中的概念&#xff0c;它是指在运动中和受力后&#xff0c;形状和大小不变&#xff0c;并且内部各点相对位置不变的物体。刚体是一种为了方便物理计算而提出的理想化模型&#xff0c;在不…

技术人员如何从容转型项目经理?

科技在发展&#xff0c;时代在进步&#xff0c;项目越来越复杂&#xff0c;越来越多的技术人员面临技术转型&#xff0c;那么&#xff0c;如何成功转型成了众多技术人员面临的新挑战。 首先我们必须要搞清楚&#xff0c;为什么需要技术人员转型项目经理&#xff1f;项目经理不…

阿里云杨国彦:云上护航,陪伴成长

以下整理自杨国彦在云栖大会“云上成就创新梦想”论坛中发表的《云上护航&#xff0c;陪伴成长》的主题演讲&#xff09; 11月5日&#xff0c;以“云上成就创新梦想”为主题的中小企业云上创新论坛在浙江杭州云栖小镇举行&#xff0c;论坛聚集政府、资本、媒体、机构等相关领导…

滴滴技术专家任玉刚:让你的职业迷茫从哪来回哪去

今天给大家推荐的是《Android开发艺术探索》的作者&#xff08;滴滴技术专家&#xff09;任玉刚老师的直播课&#xff0c;感兴趣的同学可以通过文末的方式参与本次活动&#xff08;喜欢的同学欢迎转发&#xff09;。 我是任玉刚&#xff0c; 我来我想说。 01 收到过无数同学的…

从菜鸟到资深工程师的进阶之路

专访任玉刚&#xff1a;从菜鸟到资深工程师的进阶之路 发表于 2015-12-22 08:25| 11131次阅读| 来源 CSDN| 31 条评论| 作者 夏夏 专访 iOS Android 任玉刚 开发者 CSDN博客 allowtransparency"true" frameborder"0" scrolling"no" src"h…

kafka sasl_ssl配置

一、切换到存储证书的路径 我这里在家目录中的创建了ssl文件夹 mkdir ssl && cd ssl 二、生成服务端密钥库 keytool -keystore server.keystore.jks -alias localhost -validity 365 -genkey验证证书&#xff1a; keytool -list -v -keystore server.keystore.jks …