Spring MVC拦截器(Interceptor)的定义和配置过程

 更新时间:2025年03月25日 09:29:44   作者:库隐  
这篇文章主要介绍了Spring MVC拦截器(Interceptor)的定义和配置过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

1、SpringMVC中组件: 拦截器(Interceptor)

拦截器(Interceptor)

对我们来说是非常实用的,也是经常使用的,可以在所有的HandlerMapping的前后进行拦截,当我们需要将特定功能应用于符合某种规则的请求的时候,这个时候就可以使用拦截器。

我们自定义的拦截器必须继承org.springframework.web.servlet.HandlerInterceptor,在HandlerInterceptor由三个默认方法

package org.springframework.web.servlet;

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

import org.springframework.lang.Nullable;
import org.springframework.web.method.HandlerMethod;

public interface HandlerInterceptor {
	/**
	* 在执行实际储器程序之前,根据返回的boolen判断是否放行
	*/
	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 {
	}

}

自定义的拦截器

package com.example.web.interceptor;

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

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

public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String requestURI = request.getRequestURI();
        System.out.println("请求的路径:" +requestURI);
        long startTime = System.currentTimeMillis();
        request.setAttribute("request::start",startTime);
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        long startTime = (long)request.getAttribute("request::start");
        long processEndTime = System.currentTimeMillis();
        System.out.println("处理程序执行完成耗时:"+ (processEndTime-startTime) + "毫秒");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        long startTime = (long)request.getAttribute("request::start");
        long endTime = System.currentTimeMillis();
        System.out.println("从请求到完成响应耗时:"+ (endTime-startTime) + "毫秒");
    }
}

2、拦截器(Interceptor)的配置

在自定拦截器完成后,就是在Spring MVC 中配置我们的拦截器(Interceptor)了,可以通过Java配置类的方式进行配置,也可以通过xml文件的方式进行配置。

先从Java配置类的方式来看

  • @EnableWebMvc : 表示启用Spring MVC的功能
  • @Configuration: 表示该类是Spring 中的配置类
  • 拦截的配置需要重写WebMvcConfigureraddInterceptors(InterceptorRegistry registry) 方法,通过registry进行添加(默认拦截所有)
  • 可以通过addPathPatterns来表示拦截哪些请求
  • 可以通过excludePathPatterns不拦截哪些请求

对于URI匹配模式:

  • :匹配一个字符
  • * :匹配路径段中的零个或者多个字符
  • **:匹配零个或者多个路径段
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    	registry.addInterceptor(new MyInterceptor())
        registry.addInterceptor(new LocaleChangeInterceptor());
        registry.addInterceptor(new ThemeChangeInterceptor()).addPathPatterns("/**").excludePathPatterns("/admin/**");
        registry.addInterceptor(new SecurityInterceptor()).addPathPatterns("/secure/*");
    }
}

在xml中进行配置

<mvc:interceptors>
	<bean class="com.example.web.interceptor.MyInterceptor"/>
    <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <mvc:exclude-mapping path="/admin/**"/>
        <bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor"/>
    </mvc:interceptor>
    <mvc:interceptor>
        <mvc:mapping path="/secure/*"/>
        <bean class="org.example.SecurityInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot中Redis连接超时的解决全过程

    SpringBoot中Redis连接超时的解决全过程

    在SpringBoot应用中,Redis连接超时异常通常出现在高并发场景下,因Redis连接数过多导致,通过检查连接池配置、使用监控工具和分析线程堆栈,可以定位问题,解决方案包括增加连接池大小和优化业务逻辑,通过压力测试和灰度发布验证调整效果,确保系统稳定性
    2025-11-11
  • Springboot注入成员变量HttpServletRequest的原理分析

    Springboot注入成员变量HttpServletRequest的原理分析

    这篇文章主要介绍了Springboot注入成员变量HttpServletRequest的原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • idea修改maven模块名称还显示老名称问题解决

    idea修改maven模块名称还显示老名称问题解决

    本文主要介绍了idea修改maven模块名称还显示老名称问题解决,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-11-11
  • springboot 打包部署 共享依赖包(分布式开发集中式部署微服务)

    springboot 打包部署 共享依赖包(分布式开发集中式部署微服务)

    这篇文章主要介绍了springboot 打包部署 共享依赖包(分布式开发集中式部署微服务)的相关资料,非常不错,具有参考借鉴价值,需要的的朋友参考下吧
    2017-06-06
  • java 线程公平锁与非公平锁详解及实例代码

    java 线程公平锁与非公平锁详解及实例代码

    这篇文章主要介绍了java 线程公平锁与非公平锁详解及实例代码的相关资料,需要的朋友可以参考下
    2017-02-02
  • Java利用opencv实现用字符展示视频或图片的方法

    Java利用opencv实现用字符展示视频或图片的方法

    这篇文章主要介绍了Java利用opencv实现用字符展示视频或图片的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • SpringBoot实现整合微信支付方法详解

    SpringBoot实现整合微信支付方法详解

    这篇文章主要介绍了SpringBoot实现整合微信支付的过程详解,文中的示例代码对我们的工作或学习有一定的帮助,感兴趣的小伙伴可以跟随小编学习一下
    2021-12-12
  • gateway基本配置教程

    gateway基本配置教程

    路由(Route)由一个ID,一个目标URI(最终路由到的url地址),一组断言(匹配条件判断)和一组过滤器定义,这篇文章主要介绍了gateway基本配置,需要的朋友可以参考下
    2023-05-05
  • JPA多数据源分布式事务处理方案

    JPA多数据源分布式事务处理方案

    这篇文章主要为大家介绍了JPA多数据源分布式事务处理的两种事务方案,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-02-02
  • Java中的三种标准注解和四种元注解说明

    Java中的三种标准注解和四种元注解说明

    这篇文章主要介绍了Java中的三种标准注解和四种元注解说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02

最新评论