SpringMVC(五)拦截器

目录

拦截器基本概念

[一 单个拦截器的执行](#一 单个拦截器的执行)

[1 创建拦截器](#1 创建拦截器)

[2 SpringMVC配置,并指定拦截路径。](#2 SpringMVC配置,并指定拦截路径。)

[3 运行结果展示:](#3 运行结果展示:)

[二 多个拦截器的执行顺序](#二 多个拦截器的执行顺序)

[三 拦截器与过滤器的区别](#三 拦截器与过滤器的区别)


拦截器基本概念

SpringMVC内置拦截器机制,允许在请求被目标方法处理的前后进行拦截,执行一些额外操作;比如权限验证、日志记录、数据共享等。

作用对象:controller(处理请求)

使用步骤:

  • 实现HandlerInterceptor接口的组件即可成为拦截器
  • 创建WebMvcConfigurer组件,并配置拦截器的拦截路径。
  • 查看执行顺序效果:preHandke=>目标方法=>postHandle=>afterCompletion

一 单个拦截器的执行

1 创建拦截器

这里的返回值如果是false将会将方法拦截 ,只会执行preHandle这一个方法

java 复制代码
package org.example.springmvc.interceptor;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

@Component//拦截器需要配置指定拦截的请求
public class myHandlerInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle");
        // 放行
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion");
    }
}

2 SpringMVC配置,并指定拦截路径。

java 复制代码
package org.example.springmvc.config;

import org.example.springmvc.interceptor.myHandlerInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

// 对SpringMVC的底层进行一些配置
// 需要实现一个接口WebMvcConfigurer
@Configuration
public class MySpringMVCConfig implements WebMvcConfigurer {

    private final myHandlerInterceptor myHandler;

    public MySpringMVCConfig(myHandlerInterceptor myHandler) {
        this.myHandler = myHandler;
    }

    //添加拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截所有请求
        registry.addInterceptor(myHandler).addPathPatterns("/**");
    }


}

3 运行结果展示:

总结:

Spring MVC拦截器通过灵活的三个方法钩子,为开发者提供了在请求处理流程中插入逻辑的能力,适合实现与业务紧密相关的横切关注点(如鉴权、日志)。合理使用拦截器可以显著提升代码的可维护性和复用性。

二 多个拦截器的执行顺序

个人理解总结

1 所有的preHandle都放行之后才可以执行postHandle这一行

2 如果preHandle0和preHandle1执行并返回true那么后面会依次执行preHandle2

(如果preHandle的返回值为false那么会执行afterCompletion1,afterCompletion0这两个方法)

(如果preHandle的返回值为true那么会执行postHandle2,1,0,并依次afterCompletion,2,1,0)

3 afterCompletion与postHandle两条链路互不影响,这两条链路的影响因素是preHandle这一行,如果这两条链路中在某一个环节断了(抛出异常),那么这一条链路将会停止,而另一条链路不受影响。

(如果pre这一层正常执行,而postHandle1抛出异常,那么后续的postHandle0将不再执行,而afterCompletion这一条链路不受影响正常执行。)

(如果pre这一层正常执行,而afterCompletion1抛出异常,那么后续的afterCompletion0将不再执行,而postHandle这一条链路不受影响并且已经执行完成。)

三 拦截器与过滤器的区别

在Spring框架中优先使用拦截器,在web框架可以选择filter过滤器

相关推荐
绝世唐门三哥2 分钟前
vue3中页面返回时刷新首页的处理方案
开发语言·前端·javascript
nianniannnn2 分钟前
c++复习自存--流、异常处理、多线程与C++工程规范
开发语言·c++
geovindu12 分钟前
CSharp: Dijkstra Algorithms
开发语言·后端·算法·c#
Maynor99614 分钟前
AI Coding 零基础实战教程|第五部分:完整项目案例实操
java·前端·人工智能·claude code·ai coding
XR12345678818 分钟前
食品饮料与制药行业GMP合规网络建设:无尘车间的网络不能成为污染源
开发语言·网络·php
生戎马30 分钟前
Tomcat Container容器之Engine:StandardEngine _
java·tomcat
学逆向的36 分钟前
汇编——位运算
开发语言·汇编·算法·网络安全
ahauedu37 分钟前
多租户 RAG 知识库系统基于Spring Boot 4.0.5+Spring AI 2.0.0 + Milvus
spring·rag·springai2.0
zhangjw3444 分钟前
第29篇:Java伪共享与对象分配:并发性能优化的关键
java·开发语言·性能优化
宠友信息1 小时前
内容社区源码多端数据协议与 Spring Boot 状态流转实现思路
java·spring boot·websocket·uni-app