当前位置: 首页 > news >正文

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

文章目录

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

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

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

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

过滤器配置代码:

@Configuration
public class MvcSupport implements WebMvcConfigurer {@Resourceprivate StuInterceptor stuInterceptor;@Overridepublic 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中的空方法

相关文章:

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

文章目录SpringMVC中的拦截器不生效的问题解决WebMvcConfigurationSupport继承问题思考SpringMVC中的拦截器不生效的问题解决 过滤器代码(被Spring扫描并管理)&#xff1a; Component public class StuInterceptor implements HandlerInterceptor {Overridepublic boolean pr…...

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

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

[数据结构]:15-堆排序(顺序表指针实现形式)(C语言实现)

目录 前言 已完成内容 堆排序实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-PSeqListFunction.cpp 04-SortCommon.cpp 05-SortFunction.cpp 结语 前言 此专栏包含408考研数据结构全部内容&#xff0c;除其中使用到C引用外&#xff0c;全为C语言代码…...

蓝桥 卷“兔”来袭编程竞赛专场-02破解曾公亮密码 题解

赛题介绍 挑战介绍 曾公亮编撰的《武经总要》中记载了一套严谨的军事通信密码&#xff0c;这也是目前发现我国古代战争中最早使用的军用密码表。将战场上可能常用到的情况&#xff0c;用 40 个短语归纳表示&#xff0c;且每个短语前编有固定的数字代码&#xff0c;这 40 个短…...

CSS定位

&#x1f353;个人主页&#xff1a;bit.. &#x1f352;系列专栏&#xff1a;Linux(Ubuntu)入门必看 C语言刷题 数据结构与算法 HTML和CSS3 目录 1.1为什么需要定位&#xff1f; 1.2定位组成 1.3静态定位static&#xff08;了解&#xff09; 1.4相对定位 relative …...

python sympy库

sympy库是python的符号运算库&#xff0c;是电脑辅助简单数学函数计算的好工具。本文简单记录了一下有关sympy的方法。建议使用jupyter notebook&#xff0c;这样输出的函数很好看。 文章目录sympy基础安装自变量&#xff08;Symbols&#xff09;函数表达式&#xff08;Expr&am…...

达梦数据库统计信息的导出导入

一、统计信息对象统计信息描述了对象数据的分布特征。统计信息是优化器的代价计算的依据&#xff0c;可以帮助优化器较精确地估算成本&#xff0c;对执行计划的选择起着至关重要的作用。统计信息的收集频率是一把双刃剑&#xff0c;频率太低导致统计信息滞后&#xff0c;频率太…...

信息系统基本知识(六)

大纲 信息系统与信息化信息系统开发方法常规信息系统集成技术软件工程新一代信息技术信息系统安全技术信息化发展与应用信息系统服务管理信息系统服务规划企业首席信息管及其责任 1.7 信息化发展与应用 我国在“十三五”规划纲要中&#xff0c;将培育人工智能、移动智能终端…...

<C++>智能指针

1. 智能指针 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<memory> using namespace std;int div() {int a, b;cin >> a >> b;if (b 0)throw invalid_argument("除0错误");return a / b; }void func() {int* p1 new in…...

1.分析vmlinux可执行文件是如何生成的? 2.整理内核编译流程:uImage/zImage/Image/vmlinx之间关系

一、分析vmlinux可执行文件是如何生成的&#xff1f; 1、分析内核的底层 makefile 如下&#xff1a; vmlinux: scripts/link-vmlinux.sh vmlinux_prereq $(vmlinux-deps) FORCE$(call if_changed,link-vmlinux)vmlinux_prereq: $(vmlinux-deps) FORCE发现vmlinux的生成主要依…...

数据结构4——线性表3:线性表的链式结构

基本概念 ​ 链式存储结构用一组物理位置任意的存储单元来存放线性表的数据元素。 ​ 这组存储单元既可以是连续的又可以是不连续的甚至是零散分布在任意位置上的。所以链表中元素的逻辑次序和物理次序不一定相同。而正是因为这一点&#xff0c;所以我们要利用别的方法将这些…...

weblogic 忘记密码重置密码

解决&#xff1a;weblogic 忘记密码 weblogic安装后&#xff0c;很久不用&#xff0c;忘记访问控制台的用户名或者密码&#xff0c;可通过以下步骤来重置用户名密码。 版本&#xff1a;WebLogic Server 11g 说明&#xff1a;%DOMAIN_HOME%&#xff1a;指WebLogic Server 域(…...

安卓开发之动态设置网络访问地址

之前开发程序联测测接口的时候&#xff0c;因为要和不同的后台人员调接口&#xff0c;所以经常要先把程序里的ip地址改成后台人员给我的。每次都要先修改ip地址&#xff0c;之后编译运行一下&#xff0c;才能测试。但要是换了个后台人员&#xff0c;或者同时和2个后台人员测接口…...

深度学习模型训练工作汇报(3.8)

进行数据的初始整理的准备 主要是进行伪序列字典的设置&#xff0c;以及训练数据集的准备。 期间需要的一些问题包括在读取文件信息的时候&#xff0c;需要跳过文件的第一行或者前两行&#xff0c;如果使用循环判断的话&#xff0c;会多进行n次的运算&#xff0c;这是不划算的…...

【ns-3】添加nr(5G-LENA)模块

文章目录前言1. 下载5G-LENA源代码2. 配置并重新构建ns-3项目参考文献前言 本篇以ns-3.37为例介绍如何在ns-3中添加nr&#xff08;5G-LENA&#xff09;模块 [1]。5G-LENA是一个由Mobile Networks group CTTC&#xff08;Centre Tecnolgic de Telecomunicacions de Catalunya&a…...

(枚举)(模拟)(前缀和)(数组模拟哈希)(可二分)1236. 递增三元组

目录 题目链接 一些话 流程 套路 ac代码 题目链接 1236. 递增三元组 - AcWing题库 一些话 int f[N]; memset(f,0,sizeof f)影响不到f[N] 所以尽量不要对f[N]赋值&#xff0c;不要用f[N]操作 流程 //由三重暴力i,j,k因为三重暴力底下是分别用i和j&#xff0c;j和k作比较…...

mysql五种索引类型(实操版本)

为什么使用索引 最近学习了Mysql的索引&#xff0c;索引对于Mysql的高效运行是非常重要的&#xff0c;正确的使用索引可以大大的提高MySql的检索速度。通过索引可以大大的提升查询的速度。不过也会带来一些问题。比如会降低更新表的速度&#xff08;因为不但要把保存数据还要保…...

微服务进阶之 SpringCloud Alibaba

文章目录微服务进阶&#x1f353;SpringCloud 有何劣势&#xff1f;&#x1f353;SpringCloud Alibaba 提供了什么&#xff1f;提示&#xff1a;以下是本篇文章正文内容&#xff0c;SpringCloud 系列学习将会持续更新 微服务进阶 &#x1f353;SpringCloud 有何劣势&#xff1…...

前端性能优化笔记2 第二章 度量

相关 Performance API 都在 window.performance 对象下 performance.now() 方法 精度精确到微妙获取的是把页面打开时间点作为基点的相对时间&#xff0c;不依赖操作系统的时间。 部分浏览器不支持 performance.now() 方法&#xff0c;可以用 Date.now() 模拟 performance.n…...

关于new和delete的一些思考,为什么不能在析构函数中调用delete释放对象的内存空间,new和delete的原理

最近在写代码的时候&#xff0c;觉得每次new出来的对象都需要去delete好麻烦&#xff0c;于是直接把delete写到了析构函数中&#xff0c;在析构函数里面写了句delete this&#xff0c;结果调用析构函数的时候死循环了&#xff0c;不是很理解原因&#xff0c;于是去研究了一下。…...

AI赋能 绿色未来 —— 华硕重磅亮相第二十八届海峡两岸经贸交易会

当AI浪潮席卷全球&#xff0c;绿色低碳成为时代共识&#xff0c;一场汇聚两岸智慧、共探产业新机的盛会如约而至。5月21日第二十八届海峡两岸经贸交易会于福州海峡会展中心盛大启幕。这场由国务院台办、福建省人民政府联合主办的国家级盛会&#xff0c;深耕两岸经贸交流多年&am…...

机器学习真实难点:知识断裂、工具混沌与数据偏差

1. 这不是一份职业指南&#xff0c;而是一份“入行前必读的清醒剂”“Why it’s Super Hard to be an ML Researcher or Developer?”——这个标题我第一次看到时&#xff0c;正坐在凌晨两点的实验室里&#xff0c;盯着第17版模型在验证集上掉点0.3%的结果发呆。旁边三台GPU服…...

Windows右键菜单终极清理指南:用ContextMenuManager告别杂乱,重获高效桌面

Windows右键菜单终极清理指南&#xff1a;用ContextMenuManager告别杂乱&#xff0c;重获高效桌面 【免费下载链接】ContextMenuManager &#x1f5b1;️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 还在为Windows…...

跨境电商标题焦虑?QA揭秘“批量更新标题“如何拯救你的运营效率

Q1&#xff1a;什么是"批量更新标题"&#xff1f;这玩意儿真的存在吗&#xff1f;Q&#xff1a;小彭&#xff0c;我听说有个功能叫"批量更新标题"&#xff0c;能批量改产品标题&#xff0c;是真的吗&#xff1f;还是又是那种"画大饼"的工具&…...

CANN-昇腾NPU-多机多卡-怎么把16卡用出32卡的效果

16 张 Atlas 800I A2 的理论算力是 16 310 4960 TFLOPS&#xff08;fp16&#xff09;。但实际训练 Llama2-7B 只用到了 3200 TFLOPS——利用率 64%。这篇讲怎么把利用率从 64% 提到 85%&#xff0c;等效 16 卡用出 25 卡的效果。 利用率低的原因 理论算力: 16 310 4960 TFL…...

使用Taotoken的OpenAI兼容协议与PythonSDK三分钟完成大模型接入

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 使用Taotoken的OpenAI兼容协议与Python SDK三分钟完成大模型接入 本文面向刚开始接触大模型API的开发者&#xff0c;旨在提供一个清…...

流程管理系统中的form-create应用:条件渲染与动态权限控制终极指南

流程管理系统中的form-create应用&#xff1a;条件渲染与动态权限控制终极指南 【免费下载链接】FormCreate &#x1f525;&#x1f525;&#x1f525; 强大的低代码动态表单组件&#xff0c;通过JSON数据驱动表单渲染&#xff0c;适配移动端&#xff0c;支持可视化设计。提高开…...

AI如何悄然重塑日常生活:从工具到环境的四层渗透

1. 这不是未来预告&#xff0c;是此刻正在发生的日常渗透“AI正在 quietly taking over your daily life”——这句话里最值得玩味的&#xff0c;不是“AI”&#xff0c;也不是“taking over”&#xff0c;而是那个轻描淡写的quietly&#xff08;悄然地&#xff09;。它不敲锣打…...

免费德州扑克GTO求解器终极指南:如何用Desktop Postflop提升你的扑克技术

免费德州扑克GTO求解器终极指南&#xff1a;如何用Desktop Postflop提升你的扑克技术 【免费下载链接】desktop-postflop [Development suspended] Advanced open-source Texas Holdem GTO solver with optimized performance 项目地址: https://gitcode.com/gh_mirrors/de/d…...

差点把用户数据泄漏给Claude Code后,我写了个 Rust 工具

两周前&#xff0c;我把公司的数据库接进了Claude Code&#xff0c;效率确实起飞了&#xff0c;直到我翻了一下会话记录。 两周前 公司的 PostgreSQL 数据库接进了Claude Code以后&#xff0c;AI 确实能干——帮我写迁移、联表、生成报表&#xff0c;效率直接起飞。 直到我随…...