SpringMVC拦截器的介绍,拦截器的基本实现,拦截器链配置


🐌个人主页: 🐌 叶落闲庭

💨我的专栏:💨
c语言
数据结构
javaweb

石可破也,而不可夺坚;丹可磨也,而不可夺赤。


拦截器

一、拦截器概念

  • 拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行
  • 作用:
    • 在指定的方法调用前后执行预先设定的代码
    • 阻止原始方法的执行

二、拦截器与过滤器的区别

  • 归属不同:Filter属于Servlet技术,Interceptor属于SpringMVC技术
  • 拦截内容不同:Filter对所有访问进行增强,Interceptor仅针对SpringMVC的访问进行增强

三、拦截器入门案例

3.1制作拦截器功能类

3.2 声明拦截器的bean

  • 实现HandlerInterceptor接口
  • 注意:配置好后,要在SpringMvcConfig类中扫描加载bean
java 复制代码
package com.practice.controller.interceptor;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @Author YJ
 * @Date 2023/8/16 18:34
 * Description:拦截器
 */
@Component
public class ProjectInterceptor 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...");
    }
}
  • 此处preHandle()方法中返回需注意:
  • 返回为true:不会对原始方法造成影响,继续执行postHandle()afterCompletion()方法。
  • 返回为false:此时会直接拦截住原始方法的执行,将不会执行原来的方法,只执行preHandle()方法·。

3.3定义配置类

  • 继承WebMvcConfigurationSupport,实现addInterceptors方法
  • 注意扫描加载配置
java 复制代码
package com.practice.config;

import com.practice.controller.interceptor.ProjectInterceptor;
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.WebMvcConfigurationSupport;

/**
 * @Author YJ
 * @Date 2023/8/16 18:39
 * Description:
 */
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        ...
    }
}

3.4添加拦截器

  • 设置拦截器的访问路径,路径可以通过可变参数设置多个
java 复制代码
package com.practice.config;

import com.practice.controller.interceptor.ProjectInterceptor;
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.WebMvcConfigurationSupport;

/**
 * @Author YJ
 * @Date 2023/8/16 18:39
 * Description:
 */
@Configuration
@ComponentScan({"com.practice.controller"})
public class SpringMvcSupport extends WebMvcConfigurationSupport {
    @Autowired
    private ProjectInterceptor projectInterceptor;
    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(projectInterceptor).addPathPatterns("/address","/address/*");
    }
}

3.5简化开发(侵入式较强)

  • 使用标准接口WebMvcConfigurer简化开发
java 复制代码
package com.practice.config;

import com.practice.controller.interceptor.ProjectInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @Author YJ
 * @Date 2023/8/15 18:59
 * Description:
 */
//3.创建Springmvc配置文件,加载controller对应的bean
@Configuration
@ComponentScan({"com.practice.controller"})
//开启由json数据转换为对象的功能
@EnableWebMvc
public class SpringMvcConfig implements WebMvcConfigurer {

    @Autowired
    private ProjectInterceptor projectInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(projectInterceptor).addPathPatterns("/address","/address/*");
    }
}

3.6执行流程

  • 无拦截器
  • 有拦截器

四、拦截器参数

4.1前置处理

java 复制代码
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle...");
        return true;
    }
  • 参数
    • request:请求对象
    • response:响应对象
    • handler:被调用的处理器对象,本质上是一个方法对象,对反射技术中的Method对象进行了再包装
  • 返回值
    • 返回值为false,被拦截的处理器将不执行

4.2后置处理

java 复制代码
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle...");
    }
  • 参数
    • modelAndView:如果处理器执行完成具有返回结果,可以读取到对应数据与页面信息,并进行调整

4.3完成后处理

java 复制代码
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion...");
    }
  • 参数
    • ex:如果处理器执行过程中出现异常对象,可以针对异常情况进行单独处理

五、拦截器链配置

  • 当配置多个拦截器时,形成拦截器链
  • 拦截器的运行顺序参照拦截器添加顺序为准
  • 当拦截器中出现对原始处理器的拦截,后面的拦截器均终止运行
  • 当拦截器运行中断,仅运行配置在前面的拦截器的afterCompletion操作

  • 假定有三个拦截器:1、2、3
    • 1、2、3拦截器的preHandle返回均为true时,顺序是:pre1-->pre2-->pre3-->controller-->post3-->post2-->post1-->after3-->after2-->after1
    • 1、2拦截器的preHandle返回为true,3拦截器的preHandle返回为false时,顺序是:pre1-->pre2-->pre3-->after2-->after1
  • 1拦截器的preHandle返回为true,2、3拦截器的preHandle返回为false时,顺序是:pre1-->pre2-->after1
    • 三个拦截器的preHandle返回为false时顺序是:pre1-->结束
相关推荐
克拉克盖博1 小时前
chapter03_Bean的实例化与策略模式
java·spring·策略模式
小兔兔吃萝卜6 小时前
Spring 创建 Bean 的 8 种主要方式
java·后端·spring
AAA修煤气灶刘哥8 小时前
面试官: SpringBoot自动配置的原理是什么?从启动到生效,一文讲透
后端·spring·面试
qq_三哥啊10 小时前
【IDEA】设置Debug调试时调试器不进入特定类(Spring框架、Mybatis框架)
spring·intellij-idea·mybatis
别惹CC10 小时前
Spring AI 进阶之路01:三步将 AI 整合进 Spring Boot
人工智能·spring boot·spring
寒士obj10 小时前
Spring事物
java·spring
IT毕设实战小研19 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
甄超锋20 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
Java小白程序员1 天前
Spring Framework:Java 开发的基石与 Spring 生态的起点
java·数据库·spring
甄超锋1 天前
Java Maven更换国内源
java·开发语言·spring boot·spring·spring cloud·tomcat·maven