深入探究SpringBoot拦截器的自定义设计与实现全攻略

 更新时间:2024年05月16日 10:03:33   作者:从零开始的-CodeNinja之路  
拦截器是Spring框架提供的核心功能之⼀,主要用来拦截用户的请求,在指定方法前后,根据业务需要执行预先设定的代码,本文将给大家和大家一起深入探究SpringBoot拦截器的自定义设计与实现,需要的朋友可以参考下

一. 什么是拦截器?

  • 需要修改每个接口的处理逻辑
  • 需要修改每个接口的返回结果
  • 接口定义修改,前端代码也需要跟着修改

有没有更简单的办法,统⼀拦截所有的请求,并进行Session校验呢,这里我们学习⼀种新的解决办法:拦截器

拦截器是Spring框架提供的核心功能之⼀,主要用来拦截用户的请求,在指定方法前后,根据业务需要执行预先设定的代码.也就是说,允许开发⼈员提前预定义⼀些逻辑,在用户的请求响应前后执行.也可以在用户请求前阻止其执行.

在拦截器当中,开发⼈员可以在应用程序中做⼀些通用性的操作,比如通过拦截器来拦截前端发来的
请求,判断Session中是否有登录用户的信息.如果有就可以放行,如果没有就进行拦截.

在这里插入图片描述

二. 拦截器执行流程

正常的调用顺序:

在这里插入图片描述

有了拦截器之后,会在调用Controller之前进行相应的业务处理,执行的流程如下图

在这里插入图片描述

  • 添加拦截器后,执行Controller的方法之前,请求会先被拦截器拦截住.执行 preHandle() 方法,这个方法需要返回⼀个布尔类型的值.如果返回true,就表示放行本次操作,继续访问controller中的方法.如果返回false,则不会放行(controller中的方法也不会执行).
  • controller当中的方法执行完毕后,再回过来执行 postHandle() 这个方法以及afterCompletion() 方法,执行完毕之后,最终给浏览器响应数据.

三. 拦截器

拦截器的基本使用.

拦截器的使用步骤分为两步:

  • 定义拦截器
  • 注册配置拦截器
  • 拦截器的拦截路径配置

3.1 定义拦截器

自定义拦截器:实现HandlerInterceptor接口,并重写其所有方法

@Slf4j
@Component
public class LoginInterceptor implements HandlerInterceptor {

	@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponseresponse, Object handler) throws Exception {
	log.info("LoginInterceptor 目标方法执行前执行..");
	return true;
	}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponseresponse, Object handler, ModelAndView modelAndView) throws Exception {
	log.info("LoginInterceptor 目标方法执行后执行");
	}

@Override
public void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex) throws Exception {
	log.info("LoginInterceptor 视图渲染完毕后执行,最后执行");
	}
}
  • preHandle()方法:目标方法执行前执行.返回true:继续执行后续操作;返回false:中断后续操作.
  • postHandle()方法:目标方法执行后执行
  • afterCompletion()方法:视图渲染完毕后执行,最后执行(后端开发现在⼏乎不涉及视图,暂不了 解)

3.2 注册配置拦截器

注册配置拦截器:实现WebMvcConfigurer接口,并重写addInterceptors方法

@Configuration
public class WebConfig implements WebMvcConfigurer {

//⾃定义的拦截器对象
@Autowired
private LoginInterceptor loginInterceptor;

@Override
public void addInterceptors(InterceptorRegistry registry) {
	//注册⾃定义拦截器对象
	registry.addInterceptor(loginInterceptor).addPathPatterns("/**");//设置拦截器拦截的请求路径( /** 表示拦截所有请求)
	}
}

启动服务,试试访问任意请求,观察后端日志

在这里插入图片描述

可以看到preHandle方法执行之后就放行了,开始执行目标方法,目标方法执行完成之后执行postHandle和afterCompletion方法.

我们把拦截器中preHandle方法的返回值改为false,再观察运行结果

在这里插入图片描述

可以看到,拦截器拦截了请求,没有进行响应.

3.3 拦截路径的配置

拦截路径是指我们定义的这个拦截器,对哪些请求生效.

我们在注册配置拦截器的时候,通过 addPathPatterns() 方法指定要拦截哪些请求.也可以通过excludePathPatterns() 指定不拦截哪些请求.

上述代码中,我们配置的是 /** ,表示拦截所有的请求.

比如用户登录校验,我们希望可以对除了登录之外所有的路径生效

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.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {
	//⾃定义的拦截器对象
	@Autowired
	private LoginInterceptor loginInterceptor;
	
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
	//注册⾃定义拦截器对象
	registry.addInterceptor(loginInterceptor)
		.addPathPatterns("/**")
		.excludePathPatterns("/user/login");//设置拦截器拦截的请求路径
	(/** 表示拦截所有请求)
	}
}

在拦截器中除了可以设置 /** 拦截所有资源外,还有⼀些常见拦截路径设置:

拦截路径含义举例
/*⼀级路径能匹配/user,/book,/login,不能匹配/user/login
/**任意级路径能匹配/user,/user/login,/user/reg
/book/*/book下的⼀级路径能匹配/book/addBook,不能匹配/book/addBook/1,/book
/book/**/book下的任意级路径能匹配/book,/book/addBook,/book/addBook/2,不能匹配/user/login

以上拦截规则可以拦截此项目中的使用URL,包括静态文件(图片文件,JS和CSS等文件).

以上就是深入探究SpringBoot拦截器的自定义设计与实现全攻略的详细内容,更多关于SpringBoot拦截器设计与实现的资料请关注脚本之家其它相关文章!

相关文章

  • SpringBoot+Vue中的Token续签机制

    SpringBoot+Vue中的Token续签机制

    本文主要介绍了SpringBoot+Vue中的Token续签机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • Java的回调机制实例详解

    Java的回调机制实例详解

    这篇文章主要介绍了Java的回调机制,结合实例形式详细分析了java回调机制相关原理、用法及操作注意事项,需要的朋友可以参考下
    2019-08-08
  • Java编程实现从尾到头打印链表代码实例

    Java编程实现从尾到头打印链表代码实例

    这篇文章主要介绍了Java编程实现从尾到头打印链表代码实例,小编觉得挺不错的,这里分享给大家,供需要的朋友参考。
    2017-10-10
  • 数据库连接超时java处理的两种方式

    数据库连接超时java处理的两种方式

    这篇文章主要介绍了数据库连接超时java处理的两种方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • SpringBoot配置图片访问的虚拟路径

    SpringBoot配置图片访问的虚拟路径

    大家好,本篇文章主要讲的是SpringBoot配置图片访问的虚拟路径,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • java使用DOM4J对XML文件进行增删改查操作

    java使用DOM4J对XML文件进行增删改查操作

    这篇文章主要为大家详细介绍了java使用DOM4J对XML文件进行增删改查操作,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • Spring Boot jar 启动时设置环境参数的操作

    Spring Boot jar 启动时设置环境参数的操作

    这篇文章主要介绍了Spring Boot jar 启动时设置环境参数的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java多线程批量数据导入的方法详解

    Java多线程批量数据导入的方法详解

    这篇文章主要介绍了Java多线程批量数据导入的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,下面小编和大家来一起学习下吧
    2019-06-06
  • Java前端Layer.open.btn验证无效解决方法

    Java前端Layer.open.btn验证无效解决方法

    在本篇文章里我们给大家整理了一篇关于Java前端Layer.open.btn验证无效解决方法以及实例代码,需要的朋友们可以参考学习下。
    2019-09-09
  • 关于mybatis mapper类注入失败的解决方案

    关于mybatis mapper类注入失败的解决方案

    这篇文章主要介绍了关于mybatis mapper类注入失败的解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04

最新评论