SpringMVC中的拦截器不生效的问题解决以及衍生出的WebMvcConfigurationSupport继承问题思考

news2025/1/23 12:12:02

文章目录

  • SpringMVC中的拦截器不生效的问题解决
  • WebMvcConfigurationSupport继承问题思考

SpringMVC中的拦截器不生效的问题解决

过滤器代码(被Spring扫描并管理):

@Component
public class StuInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("前置过滤器");
        return true;
    }

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

过滤器配置代码:

@Configuration
public class MvcSupport implements WebMvcConfigurer {

    @Resource
    private StuInterceptor stuInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        System.out.println(stuInterceptor);
        registry.addInterceptor(stuInterceptor).addPathPatterns("/stu");
    }
}

按理说我们发出请求localhost/stu之后,应该可以看到过滤器的效果,但是失效了。

网上的说法众说纷纭:

  • 没加@Component或者@Configuration注解
  • @ComponentScan没扫描到
  • 路径配置错了

以上三种说法一一排除之后,我发现一个博客提到了:
在这里插入图片描述

我想到在SpringMVC的配置类上使用了@EnableWebMvc注解,而这个注解相当于在容器中引入了DelegatingWebMvcConfiguration类,而这个DelegatingWebMvcConfiguration类是继承于WebMvcConfigurationSupport的:
在这里插入图片描述
于是我把@EnableWebMvc这个注解去掉之后再进行尝试,发现过滤器生效:
在这里插入图片描述

WebMvcConfigurationSupport继承问题思考

首先我们要对下面的五个类有基本的了解:

  • WebMvcConfigurer
  • WebMvcConfigurerAdapter
  • WebMvcConfigurationSupport
  • DelegatingWebMvcConfiguration
  • WebMvcConfigurerComposite

关系如下:

  • WebMvcConfigurer 接口提供了很多方法让我们来定制SpringMVC的配置
  • WebMvcConfigurationSupport是一个具体类,其中有很多 @Bean 的方法,注入 SpringMVC 的一些关键组件,方法中会调用一些空方法,子类只需重写这些空方法就可以实现定制SpringMVC,而WebMvcConfigurationAdapter则是一个抽象类
  • WebMvcConfigurationSupport、WebMvcConfigurationAdapter都可以实现配置SpringMVC,即都可以配置视图解析器、拦截器以及静态资源等
  • WebMvcConfigurerAdapter 实现了WebMvcConfigurer ,所有方法实现都是空实现,且为抽象类,子类只需覆盖感兴趣的方法即可。
  • 在 Spring5.0 开始,WebMvcConfigurer 接口的所有方法都改为了默认方法(基于java8),所以就 不再需要WebMvcConfigurerAdapter类 了,也加上了@Deprecated,子类直接实现 WebMvcConfigurer 即可。
  • WebMvcConfigurationSupport 支持的自定义的配置更多更全,WebMvcConfigurerAdapter有的方法,这个类也都有。该类是提供MVC Java config 背后配置的主要类。 通常是通过将@EnableWebMvc添加到应用程序的@Configuration类中来导入的。 另一个更高级的选择是直接从此类扩展并在需要时重写方法,记住子类要添加@Configuration,重写带有@Bean的方法也要加上@Bean。
  • @EnableWebMvc=WebMvcConfigurationSupport,使用了@EnableWebMvc注解等于扩展了WebMvcConfigurationSupport但是没有重写任何方法
  • DelegatingWebMvcConfiguration由@EnableWebMvc注解引入,它继承了WebMvcConfigurationSupport
  • 在DelegatingWebMvcConfiguration 类中,有个 @Autowired 的方法 setConfigurers(List<WebMvcConfigurer> configurers),获取Spring容器的所有 WebMvcConfigurer 类型的bean,存储到 WebMvcConfigurerComposite 类型的 configurers 属性中。然后利用上面的 configurers 属性重写 WebMvcConfigurationSupport 中所有的空方法
    在这里插入图片描述
    在这里插入图片描述

另外,WebMvcConfigurationSupport(@EnableWebMvc)和@EnableAutoConfiguration这两种方式都有一些默认的设定。所以有以下几种使用方式:

  • @Configuration + @EnableWebMvc + extends WebMvcConfigurer ,在扩展的类中重写父类的方法即可,但会使springboot的@EnableAutoConfiguration自动配置失效
  • @Configuration + extends WebMvcConfigurationSupport,在扩展的类中重写父类的方法即可,但会使springboot的@EnableAutoConfiguration自动配置失效
  • @Configuration + extends WebMvcConfigurer ,在扩展的类中重写父类的方法即可,这种方式依旧使用springboot的@EnableAutoConfiguration中的设置

WebMvcConfigurationSupport类是彻底自定义配置springmvc,若容器中有该类的子类bean,则springboot的自动配置都会失效,因为WebMvcAutoConfiguration类有 @ConditionalOnMissingBean(WebMvcConfigurationSupport.class)

如果还是觉得有点迷糊,那么记住以下两点即可:

  • 容器中只需要维护一个WebMvcConfigurationSupport即可,多了会失效(最容易出错的情况就是在使用@EnableWebMvc的情况下,又去继承WebMvcConfigurationSupport进行配置)。
  • 在使用了@EnableWebMvc的情况下,对springmvc的自定义配置实现WebMvcConfigurer是最稳妥的,因为DelegatingWebMvcConfiguration会对所以实现了WebMvcConfigurer的配置类进行收集然后去重写WebMvcConfigurationSupport中的空方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/397069.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Dynamics365安装失败解决及注册编写

一、修改错误昨天登录报错今天开始返回我之前设置的断点开始重新配置&#xff0c;Reporing Services配置完成后发现dynamics365还是下载失败之后下载了一上午dynamics365就一直卡在最后的界面进度条不动索性我直接把所有环境都卸载了 连同虚拟机卸载重装终于在下午的时候dynami…

设计模式---工厂模式

目录 1. 简单工厂模式 2. 工厂方法模式 1. 简单工厂模式 简单工厂模式(Simple Factory Patterm)又称为静态工厂方法模式(Static Factory Model)&#xff0c;它属于类创建型模式。在简单工厂模式中&#xff0c;可以根据参数的不同返回不同类的实例。简单工厂模式专门定义了一…

【Nginx】Nginx的安装配置

环境说明系统&#xff1a;Centos 7一、编译安装Nginx官网下载地址nginx: download#安装依赖 [rootnginx nginx-1.22.1]# yum install gcc pcre pcre-devel zlib zlib-devel -y #从官网下载Nginx安装包&#xff0c;并进行解压、编译、安装 [rootnginx ~]# wget https://nginx.or…

【第八课】空间数据基础与处理——数据结构转化

一、前言 数据结构即指数据组织的形式,是适合于计算机存储、管理和处理的数据逻辑结构。对空间数据则是地理实体的空间排列方式和相互关系的抽象描述。它是对数据的一种理解和解释,不说明数据结构的数据是毫无用处的,不仅用户无法理解,计算机程序也不能正确地处理,对同样一组数…

【C++学习】栈 | 队列 | 优先级队列 | 反向迭代器

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《C学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 栈 | 队列 | 优先级队列 | 反向迭代器&#x1f63c;容器适配器&#x1f648;什么是适配器&#x1f64…

数据清洗和特征选择

数据清洗和特征选择 数据清洗和特征挖掘的工作是在灰色框中框出的部分&#xff0c;即“数据清洗>特征&#xff0c;标注数据生成>模型学习>模型应用”中的前两个步骤。 灰色框中蓝色箭头对应的是离线处理部分。主要工作是 从原始数据&#xff0c;如文本、图像或者应…

MySQL的基本语句(SELECT型)

基本MySQL语句SELECTSELECT FROM 列的别名去除重复行空值着重号算术运算符加法( )减法( - )乘法( * )除法&#xff08; / 或DIV)求模&#xff08; % 或MOD)比较运算符等于&#xff08; &#xff09;安全等于&#xff08; <> &#xff09;不等于&#xff08; ! 或 <…

WindTerm 界面/UI字体大小调节

文章目录WindTerm 界面/UI字体大小调节问题&#xff1a;解决办法&#xff1a;第一部分&#xff1a;调整编码部分字体大小第二部分&#xff1a;调整UI界面字体大小WindTerm 界面/UI字体大小调节 问题&#xff1a; 今天在使用windTerm的时候&#xff0c;发现windterm界面字体过…

MySQL基础篇1

第1章 数据库介绍 1.1 数据库概述 什么是数据库&#xff1f; 数据库就是存储数据的仓库&#xff0c;其本质是一个文件系统&#xff0c;数据按照特定的格式将数据存储起来&#xff0c;用户可以对数据库中的数据进行增加&#xff0c;修改&#xff0c;删除及查询操作。 数据库分两…

多线程的Thread 类及方法

✨个人主页&#xff1a;bit me&#x1f447; ✨当前专栏&#xff1a;Java EE初阶&#x1f447; ✨每日一语&#xff1a;海压竹枝低复举&#xff0c;风吹山角晦还明。 目 录&#x1f332;一. 线程的复杂性&#x1f334;二. Thread 类及常见方法&#x1f4d5;2.1 Thread 的常见构…

Dubbo的服务暴漏与服务发现源码详解

服务暴漏 如果配置需要刷新则根据配置优先级刷新服务配置 如果服务已经导出&#xff0c;则直接返回 是否异步导出&#xff08;全局或者服务级别配置了异步&#xff0c;则需要异步导出服务&#xff09; 服务暴漏入口DefaultModuleDeployer#exportServices private void exp…

Redis缓存穿透

缓存穿透&#xff1a; 缓存穿透说简单点就是⼤量请求的 key 根本不存在于缓存中&#xff0c;导致请求直接到了数据库上&#xff0c; 根本没有经过缓存这⼀层。举个例⼦&#xff1a;某个⿊客故意制造我们缓存中不存在的 key 发起⼤量 请求&#xff0c;导致⼤量请求落到数据库。…

http笔记

文章目录1、什么是http&#xff1f;2、http报文格式3、请求报文1、认识URL2、认识http方法3、认识header4、响应报文5、https加密机制1、什么是http&#xff1f; http是应用层最广泛使用的协议之一&#xff1b;其中浏览器获取到网页就是基于http实现的&#xff1b;http就是浏览…

Caddy2学习笔记——Caddy2反向代理docker版本的DERP中继服务器

一、个人环境概述 本人拥有一个国内云服务商的云主机和一个备案好的域名&#xff0c;通过caddy2来作为web服务器。我的云主机系统是Ubuntu。 我的云主机是公网ip&#xff0c;地址为&#xff1a;43.126.100.78&#xff1b;我备案好的域名是&#xff1a;hotgirl.com。后面的文章…

【量化交易笔记】3.实现数据库保存数据

上一节&#xff0c;我们通过下载相关的 pandas 数据保存为 本地csv文件&#xff0c;这一节将上节的数据以数据库方式保存。 数据库保存 采集数据部分前一节已做说明&#xff0c;这里就直接用采用前面的内容。这里着重说明的事数据库连接。对与 python 相连接的数据库有很多&a…

玩转Python的交互(命令行)模式

我喜欢使用Python的交互界面&#xff08;命令行模式&#xff09;来运行和调试Python代码。为什么不用PyCharm、VSCode&#xff1f;因为先入为主&#xff0c;加上我的DOS命令行的情结&#xff0c;我第一次安装使用Python就是用这种黑白界面的&#xff0c;平时写代码惯用EmEditor…

MySQL慢查询

2 慢查询 2.1 慢查询介绍 MySQL的慢查询日志是MySQL提供的一种日志记录&#xff0c;它用来记录在MySQL中响应时间超过阀值的语句&#xff0c;具体指运行时间超过long_query_time值的SQL&#xff0c;则会被记录到慢查询日志中。具体指运行时间超过long_query_time值的SQL&…

软件测试之快速熟悉项目

快速熟悉项目 1、了解项目架构 C/S架构 C/S 代表的是客户端/服务器&#xff08;client/server&#xff09;&#xff0c;这类软件的使用者需要在本地电脑安装客户端程序&#xff0c;例如&#xff1a;QQ。 优点:安全性高。 缺点:一旦软件有更新&#xff0c;用户需要手动下载&am…

Rust 开发系列PyO3:Rust与Python的联动编程(中)

第三节&#xff1a;对比C语言的Python原生扩展开发模式 C/c编写Python扩展的方法&#xff0c;与Rust大致是相同的&#xff0c;如果不论语言本身的语法带来的繁琐的话&#xff0c;就单纯以开发步骤和模式来看&#xff0c;原生语言写扩展的步骤更为标准和简单。 大致来说&#…

QT入门Item Views之QTreeView

目录 一、QTreeView界面相关 1、布局介绍 二、基本属性功能 1、设置单元格不能编辑 2、一次选中一个item 3、去掉鼠标移动到单元格上的虚线框 4、最后一列自适应 三、代码展示 1、创建模型&#xff0c;导入模型 2、 右键菜单栏 3、双…