【spring mvc】配置默认Servlet处理器

最近在开发项目时遇到将springmvc无法处理的静态资源请求转发给tomcat默认的servlet进行处理的场景,然后根据DispatcherServlet请求的路径,找到了如何配置默认Servlet处理器。

一、配置方式

具体需要看您是否使用了springmvc提供的方式完成的注入配置:

  1. 使用了@EnableWebMvc注解
  2. 使用了SpringBoot中的自动装配(org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration.EnableWebMvcConfiguration)

这两种方式都是间接的使用了DelegatingWebMvcConfiguration完成了springmvc的配置

针对这种情况可以写一个WebMvcConfigurer接口的实现来完成配置:

@Component
public class WebMvcConfigurerImpl extends WebMvcConfigurerAdapter {

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable("default");
    }
}

如果您是直接继承WebMvcConfigurationSupport类完成的springmvc配置,可以重写父类的方法来完成配置:

@Configuration
public class WebMvcConfigurationImpl extends WebMvcConfigurationSupport {

    @Override
    protected void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable("default");
    }

}

其中default是tomcat默认的Servlet的名称。 

二、原理

要了解此配置的实现机制需要看WebMvcConfigurationSupport中的定义:

/**
 * Return a handler mapping ordered at Integer.MAX_VALUE with a mapped
 * default servlet handler. To configure "default" Servlet handling,
 * override {@link #configureDefaultServletHandling}.
 */
@Bean
public HandlerMapping defaultServletHandlerMapping() {
    DefaultServletHandlerConfigurer configurer = new DefaultServletHandlerConfigurer(this.servletContext);
    configureDefaultServletHandling(configurer);

    HandlerMapping handlerMapping = configurer.buildHandlerMapping();
    return (handlerMapping != null ? handlerMapping : new EmptyHandlerMapping());
}

/**
 * Override this method to configure "default" Servlet handling.
 * @see DefaultServletHandlerConfigurer
 */
protected void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
}

类中定义了defaultServletHandlerMapping方法,方法中创建了DefaultServletHandlerConfigurer对象,使用此对象的buildHandlerMapping方法用于构建一个HandlerMapping对象。

  1. public class DefaultServletHandlerConfigurer {
    
        private final ServletContext servletContext;
    
        private DefaultServletHttpRequestHandler handler;
    
    
        /**
         * Create a {@link DefaultServletHandlerConfigurer} instance.
         * @param servletContext the ServletContext to use.
         */
        public DefaultServletHandlerConfigurer(ServletContext servletContext) {
           Assert.notNull(servletContext, "ServletContext is required");
           this.servletContext = servletContext;
        }
    
    
        /**
         * Enable forwarding to the "default" Servlet.
         * <p>When this method is used the {@link DefaultServletHttpRequestHandler}
         * will try to autodetect the "default" Servlet name. Alternatively, you can
         * specify the name of the default Servlet via {@link #enable(String)}.
         * @see DefaultServletHttpRequestHandler
         */
        public void enable() {
           enable(null);
        }
    
        /**
         * Enable forwarding to the "default" Servlet identified by the given name.
         * <p>This is useful when the default Servlet cannot be autodetected,
         * for example when it has been manually configured.
         * @see DefaultServletHttpRequestHandler
         */
        public void enable(String defaultServletName) {
           this.handler = new DefaultServletHttpRequestHandler();
           this.handler.setDefaultServletName(defaultServletName);
           this.handler.setServletContext(this.servletContext);
        }
    
    
        /**
         * Return a handler mapping instance ordered at {@link Integer#MAX_VALUE} containing the
         * {@link DefaultServletHttpRequestHandler} instance mapped to {@code "/**"};
         * or {@code null} if default servlet handling was not been enabled.
         * @since 4.3.12
         */
        protected SimpleUrlHandlerMapping buildHandlerMapping() {
           if (this.handler == null) {
              return null;
           }
    
           SimpleUrlHandlerMapping handlerMapping = new SimpleUrlHandlerMapping();
           handlerMapping.setUrlMap(Collections.singletonMap("/**", this.handler));
           handlerMapping.setOrder(Integer.MAX_VALUE);
           return handlerMapping;
        }
    
        /**
         * @deprecated as of 4.3.12, in favor of {@link #buildHandlerMapping()}
         */
        @Deprecated
        protected AbstractHandlerMapping getHandlerMapping() {
           return buildHandlerMapping();
        }
    
    }
    
    DefaultServletHandlerConfigurer中定义了enable方法,enable方法用于创建DefaultServletHttpRequestHandler对象,并设置DefaultServletHttpRequestHandler对象的默认Servlet名称和Servlet上下文;而buildHandlerMapping方法则用于创建一个SimpleUrlHandlerMapping对象用于处理其余HandlerMapping不能处理的所有请求,使用的处理器正是enable方法中创建的DefaultServletHttpRequestHandler对象。
  2. @Override
    public void handleRequest(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
    
        RequestDispatcher rd = this.servletContext.getNamedDispatcher(this.defaultServletName);
        if (rd == null) {
           throw new IllegalStateException("A RequestDispatcher could not be located for the default servlet '" +
                 this.defaultServletName + "'");
        }
        rd.forward(request, response);
    }
    

    DefaultServletHttpRequestHandler对象中处理请求使用了请求转发。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode_链表的回文结构

✨✨所属专栏&#xff1a;LeetCode刷题专栏✨✨ ✨✨作者主页&#xff1a;嶔某✨✨ 题目描述&#xff1a; 对于一个链表&#xff0c;请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法&#xff0c;判断其是否为回文结构。给定一个链表的头指针A&#xff0c;请返回一个bo…

【telnet 命令安装】centos8 linux下安装telnet命令

在CentOS 8上安装Telnet服务&#xff0c;您需要分别安装Telnet客户端和服务器端。以下是安装步骤的概述&#xff1a; 检查是否已安装Telnet&#xff1a; 您可以使用rpm命令来检查系统是否已经安装了Telnet客户端或服务器端。例如&#xff1a; rpm -qa | grep telnet-client rpm…

标准 数字化

政策法规&#xff1a; 标准化建设相关政策&#xff0c;包括《国家标准化发展纲要》&#xff0c;《重庆市的标准化条例》 标准数字化转型路线&#xff1a;标准数字化转型的白皮书、发展跟踪报告之类 相关文献&#xff1a;标准数字化转型发展现状与工作路线(大多是电力方面)、数…

uni-app canvas 签名

调用方法 import Signature from "/components/signature.vue" const base64Img ref() //监听getSignImg uni.$on(getSignImg, ({ base64, path }) > {base64Img.value base64//console.log(签名base64, path >, base64, path) //拿到的图片数据// 之后取消…

基于51单片机的矩阵按键扫描的proteus仿真

文章目录 一、按键按键按键消抖 二、独立按键仿真图仿真程序 三、矩阵按键仿真图仿真程序 四、总结 一、按键 按键 按键通常指的是电子设备上的一种输入装置&#xff0c;用于在按下时发送信号&#xff0c;以便设备执行相应的操作。按键可以分为独立按键和矩阵按键两种类型。 …

无人机GB42590接收端 +接收端模组,同时支持2.4G与5.8G双频

严格按照GB42590的协议开发的发射端&#xff0c;通过串口和模块通讯&#xff0c;默认波特率 921600。 http://www.doit.am/深圳四博智联科技有限公司https://shenzhendoit.taobao.com/category-1734422372.htm?spma1z10.1-c-s.0.0.560c74d77eT01G&searchy&catNameGB4…

Qt开发(二)打包发布

注意qt6生成的exe不能再win7&#xff08;包含win7&#xff09;以下运行 1、编译程序 编译程序不演示 2、找到exe文件 在这个路径下找到该exe文件 3、打包 新建一个文件夹 将exe放在该文件夹下除了exe开始这里面没有其他文件 找到安装目录下 在cmd中运行 把这个文件和编…

【Java】文件大小转换工具类(B,KB,MB,G,TB,PB)

说明 使用方法&#xff1a;FileMemoryUtil.prettyByteSize(35871)&#xff0c;参数为字节个数 返回结果&#xff1a;保留一位小数的自适应结果&#xff08;例如&#xff1a;4.1KB&#xff09;。可以留意在浏览器上下载的文件&#xff0c;会根据文件大小展示不同的单位&#xff…

Docker创建redis容器

Docker运行Redis 一&#xff1a;Docker安装Redis docker search redis二&#xff1a;Docker拉取镜像 下面两个命令看自己的需求 docker pull <镜像名称>&#xff1a;<版本号> #需要自己清楚自己需要什么般本的redisdocker pull redis #这个命令会自动下载最新…

C语言入门课程学习笔记3

C语言入门课程学习笔记3 第12课 - if 语句编程练习第13课 - switch 多分支选择语句第14课 - 程序中的循环结构第15课 - while 语句编程练习第16课 - do...while 与 for第17课 - break 与 continue 本文学习自狄泰软件学院 唐佐林老师的 C语言入门课程&#xff0c;图片全部来源于…

BUUCTF-Misc21

[GXYCTF2019]SXMgdGhpcyBiYXNlPw1 1.打开附件 是一个文本文档 里面有很多字符串 2.PuzzleSolver 用PuzzleSolver工具进行多组base64解码 3.得到flag 间谍启示录1 1.打开附件 是一个.iso文件 2.foremost 用foremost 分离文件 查看分离的文件 发现一个压缩包 3.运行 解压之…

Python | Leetcode Python题解之第47题全排列II

题目&#xff1a; 题解&#xff1a; class Solution:def permuteUnique(self, nums: List[int]) -> List[List[int]]:def dfs(x):if x len(nums) - 1:res.append(list(nums)) # 添加排列方案returndic set()for i in range(x, len(nums)):if nums[i] in dic: continue …

历史遗留问题-Oracle 19c RAC 安装时节点连接性问题

测试服务器的二节点数据库宕掉了&#xff0c;原因不明&#xff0c;需要产环境重新安装。我想上次在自己虚拟机安装实验过一次&#xff0c;应该一天能搞定&#xff0c;事实证明&#xff0c;你永远有学不完的bug&#xff01;&#xff01;&#xff01;&#xff01; 首先查看一下系…

算法基础:并查集详解

并查集 并查集&#xff0c;在一些有N个元素的集合应用问题中&#xff0c;我们通常是在开始时让每个元素构成一个单元素的集合&#xff0c;然后按一定顺序将属于同一组的元素所在的集合合并&#xff0c;其间要反复查找一个元素在哪个集合中。这一类问题近几年来反复出现在信息学…

Web前端开发之HTML_2

HTML5简介与基础骨架标题标签标签之段落、换行、水平线标签之图片标签之超文本链接标签之文本列表标签之有序列表列表标签之无序列表 1. HTML5简介与基础骨架 1.1 HTML5简介 HTML5是用来描述网页的一种语言&#xff0c;被称为超文本标记语言。用HTML5编写的文件&#xff0c;后…

伴游平台搭建重点,会用到哪些三方服务?

伴游平台搭建的重点在于确保用户的安全与体验&#xff0c;提供便捷的服务&#xff0c;同时维护平台的稳定运营。在搭建过程中&#xff0c;可能会用到以下三方服务&#xff1a; 身份验证与背景调查服务&#xff1a;由于伴游服务涉及到用户的个人安全和信任问题&#xff0c;因此需…

企业微信代开发应用登录操作

首先声明&#xff1a;企微的文档写得真烂&#xff01;&#xff01;&#xff01;有一些问题&#xff0c;官方情愿在问答区给用户一个个解答&#xff0c;也不愿意在文档写清楚&#xff0c;生怕自己工作量不饱和被优化。 概念说明 代开发应用&#xff0c;是相对于自建应用来说的。…

如何解决 IntelliJ IDEA 2024 启动总闪退问题?一站式解决方案!

&#x1f9e0; 如何解决 IntelliJ IDEA 2024 启动总闪退问题&#xff1f;一站式解决方案&#xff01; 文章目录 &#x1f9e0; 如何解决 IntelliJ IDEA 2024 启动总闪退问题&#xff1f;一站式解决方案&#xff01;摘要引言正文一级标题&#xff1a;检查和优化内存设置一级标题…

经验丰富也被裁了,失业快2年找不到工作?

前几天徐工说&#xff0c;他有个邻居&#xff0c;最近逮到他总是要跟他扯上几句。 原因是徐工一直是做嵌入式开发&#xff0c;而他一直做纯软件开发&#xff0c;具体不知道做后端还是前端。 他说&#xff0c;他至少有半年没上班了&#xff0c;之前在一家龙头物流公司上班。 碰上…

五年Python从业者,谈谈Python的一些优缺点

前言 Python它是作为年轻的血液&#xff0c;融入到编程语言这个大家庭里面&#xff0c;作为具有年轻人的蓬勃朝气的python&#xff0c;那它同时就会有年轻人的桀骜焦躁。 今天就来谈谈Python的一些优缺点。 先从优点说起&#xff0c;我是把它分为5部分。 1.简单————Pyth…
最新文章