【Spring Boot】 深入理解Spring Boot拦截器:自定义设计与实现全攻略

简介: 【Spring Boot】 深入理解Spring Boot拦截器:自定义设计与实现全攻略

SpringBoot统⼀功能处理

一. 什么是拦截器?

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

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

截器

拦截器是Spring框架提供的核心功能之⼀,主要用来拦截用户的请求,在指定方法前后,根据业务需要执

行预先设定的代码.也就是说,允许开发⼈员提前预定义⼀些逻辑,在用户的请求响应前后执行.也可以在用户请求前阻止其执行.

在拦截器当中,开发⼈员可以在应用程序中做⼀些通用性的操作,比如通过拦截器来拦截前端发来的

请求,判断Session中是否有登录用户的信息.如果有就可以放行,如果没有就进行拦截.


二. 拦截器执行流程

正常的调用顺序:

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

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


三. 拦截器

拦截器的基本使用.

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

  1. 定义拦截器
  2. 注册配置拦截器
  3. 拦截器的拦截路径配置
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等文件).

相关文章
|
6月前
|
缓存 监控 Java
《深入理解Spring》拦截器(Interceptor)——请求处理的艺术
Spring拦截器是Web开发中实现横切关注点的核心组件,基于AOP思想,可在请求处理前后执行日志记录、身份验证、权限控制等通用逻辑。相比Servlet过滤器,拦截器更贴近Spring容器,能访问Bean和上下文,适用于Controller级精细控制。通过实现`HandlerInterceptor`接口的`preHandle`、`postHandle`和`afterCompletion`方法,可灵活控制请求流程。结合配置类注册并设置路径匹配与执行顺序,实现高效复用与维护。常用于认证鉴权、性能监控、统一异常处理等场景,提升应用安全性与可维护性。
|
6月前
|
前端开发 Java 应用服务中间件
《深入理解Spring》 Spring Boot——约定优于配置的革命者
Spring Boot基于“约定优于配置”理念,通过自动配置、起步依赖、嵌入式容器和Actuator四大特性,简化Spring应用的开发与部署,提升效率,降低门槛,成为现代Java开发的事实标准。
|
6月前
|
前端开发 Java 微服务
《深入理解Spring》:Spring、Spring MVC与Spring Boot的深度解析
Spring Framework是Java生态的基石,提供IoC、AOP等核心功能;Spring MVC基于其构建,实现Web层MVC架构;Spring Boot则通过自动配置和内嵌服务器,极大简化了开发与部署。三者层层演进,Spring Boot并非替代,而是对前者的高效封装与增强,适用于微服务与快速开发,而深入理解Spring Framework有助于更好驾驭整体技术栈。
|
6月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
689 2
|
7月前
|
人工智能 Java 机器人
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
Spring AI Alibaba集成Ollama,基于Java构建本地大模型应用,支持流式对话、knife4j接口可视化,实现高隐私、免API密钥的离线AI服务。
6432 2
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
存储 JSON Java
841 0
|
6月前
|
Java 测试技术 数据库连接
【SpringBoot(四)】还不懂文件上传?JUnit使用?本文带你了解SpringBoot的文件上传、异常处理、组件注入等知识!并且带你领悟JUnit单元测试的使用!
Spring专栏第四章,本文带你上手 SpringBoot 的文件上传、异常处理、组件注入等功能 并且为你演示Junit5的基础上手体验
1080 3
|
6月前
|
JavaScript Java Maven
【SpringBoot(二)】带你认识Yaml配置文件类型、SpringMVC的资源访问路径 和 静态资源配置的原理!
SpringBoot专栏第二章,从本章开始正式进入SpringBoot的WEB阶段开发,本章先带你认识yaml配置文件和资源的路径配置原理,以方便在后面的文章中打下基础
559 5

热门文章

最新文章

下一篇
开通oss服务