101 向一个不存在的路径发送请求, get 得到 404, post 得到 405

前言

 

这是 最近碰到的一个问题, 大概是在 2022.05.30

前端这边 发送了一个业务请求过来, 这个请求路径是服务端这边不存在的

但是 奇怪的一点就是, 如果是以 get 请求发送过来, 服务端响应的是正确的 404 "Not Found", 但是 如果是以 post 请求发送过来, 服务端这边响应的是 405 "Method Not Allowed"

因此 之后 花了一些时间 来看一下 这个问题

 

 

测试用例

这是一个测试的 notFound 的手动处理的服务 

@RestController
@RequestMapping("/HelloWorld")
public class HelloWorldController {@GetMapping("/notFound")public List<JSONObject> notFound() {List<JSONObject> result = new ArrayList<>();result.add(wrapEntity("404", "not-found"));return result;}
}

 

这是 mvcConfigure, 这里向容器中注册了一些错误页面的处理方式 

比如 这里的 404, 直接 转发到 "/HelloWorld/notFound", 具体的这个转发步骤是在 tomcat 中处理的

/*** MyWebMvcConfigurer** @author Jerry.X.He <970655147@qq.com>* @version 1.0* @date 2022-06-12 11:39*/
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {@Beanpublic WebServerFactoryCustomizer containerCustomizer() {return new WebServerFactoryCustomizer<ConfigurableWebServerFactory>() {@Overridepublic void customize(ConfigurableWebServerFactory factory) {ErrorPage errorPage = new ErrorPage(HttpStatus.NOT_FOUND, "/HelloWorld/notFound");Set<ErrorPage> errorPageSet = new LinkedHashSet<>();errorPageSet.add(errorPage);factory.setErrorPages(errorPageSet);}};}}

 

 

post 为什么响应的是 405?

如果是发送 post 请求响应结果如下, 服务端响应的是 405 

b6817a92edb141ceb4e207adb5723fdb.png

 

 

首先需要注意的是 errorPage 的这部分处理 在 tomcat 中是找到 errorCode 对应的 errorPage 

然后再通过 servletContext.getRequestDispatcher(errorPage.path).forward(req, resp)

90514277c1234b15a688c6a352855310.png

 

然后因为我配置的 "/HelloWorld/notFound" 仅仅支持 GET

我这里原请求是 POST, dispatch 之后依然是 POST, 因此 服务端校验 method 的时候, 响应了 405 

25cf29e2ffcf4ff9b39d9170ec622338.png

 

如果是 get 请求

服务器发现 没有匹配的资源, 根据 errorCode 寻找 errorPage 

然后 dispatch 到 “/HelloWorld/notFound”, 然后 响应了相关的结果返回给客户端

比如 这里的 { name -> 404, age -> not-found } 

cee2a1ba502d4b43b9d48e7cde63605d.png

 

ErrorPage 的相关处理流程

首先是 服务器使用这边, 根据 statusCode 查询 errorPage, 这个映射来自于 tomcat 的 StandardContext 

然后 走后面的 servletContext.getRequestDispatcher(errorPage.path).forward(req, resp) 的流程 

90e795f2146845bca09c008f4dc92778.png

 

然后 我们代码中注册的 404 的 errorPage 被添加是在 WebServerFactory 初始化 StandardContext 的时候

a4649f0f02b24c579570aad1938b0677.png

 

我们的注册 errorPage 的地方是在 WebServerFactoryCustomizerBeanPostProcessor 中处理的, 当 WebServerFactory 实例初始化之后, init之前, 调用 Customizer 

这样 这一整个流程就串联起来了 

e954d89817c846eda52e09ae2314f316.png

 

 

 

 

 

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

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

相关文章

Springboot整合rabbitmq(二)

spring boot&#xff0c;为了简化rabbitMQ的使用&#xff0c;它在这里面给咱们提供了一个模板对象。 这个模板对象是什么&#xff1f; 这个模板对象叫RabbitTemplate对象。说白了其实是用来简化rabbitMQ的操作 也就是说之后我们可以通过这个模板对象直接去向rabbitMQ中发送消息…

1分钟做的AI利润表分析报告,效果怎样?

各位数据的朋友&#xff0c;大家好&#xff0c;我是老周道数据&#xff0c;和你一起&#xff0c;用常人思维数据分析&#xff0c;通过数据讲故事&#xff01; 自从去年年初ChatGPT3.5推出以来&#xff0c;AI大模型的话题就一直非常热了。相比于AI聊天、生成图片&#xff0c;亦…

STL空间配置器

参考《STL源码剖析-侯捷》一书 (SGI版本STL) 前置 六大组件 空间配置器实现 SGI版本的空间配置器有两个&#xff0c;一个名为allocator&#xff0c;一个名为alloc。前者符合部分标准&#xff0c;但效率不好&#xff0c;只是对operator new和operator delete进行了封装&#…

工业互联网平台的专题报告

文 | BFT机器人 前言&#xff1a; 现在是工业时代&#xff0c;也是数字化时代。随着信息技术的快速发展&#xff0c;工业不得不依托数字化转型升级。当前数字化转型已经成为企业提升竞争力的关键手段。 工业互联网平台作为数字化转型的重要支撑&#xff0c;能够帮助企业实现生…

(day 2)JavaScript学习笔记(基础之变量、常量和注释)

概述 这是我的学习笔记&#xff0c;记录了JavaScript的学习过程&#xff0c;我是有一些Python基础的&#xff0c;因此在学习的过程中不自觉的把JavaScript的代码跟Python代码做对比&#xff0c;以便加深印象。我本人学习软件开发纯属个人兴趣&#xff0c;大学所学的专业也非软件…

【学习心得】爬虫逆向的小技巧小知识(持续更新)

&#xff08;一&#xff09;小知识 windows.onload function () {doit()} 当页面加载完成后立即执行doit函数BrowserType() 用来获取浏览器的一系列参数constructor 是类的特殊方法&#xff0c;当new一个类的新实例时该方法被调用window.btoa(string) 将一个ASCII字符串变成B…

Linux系统编程(六)高级IO

目录 1. 阻塞和非阻塞 IO 2. IO 多路转接&#xff08;select、poll、epoll&#xff09; 3. 存储映射 IO&#xff08;mmap&#xff09; 4. 文件锁&#xff08;fcntl、lockf、flock&#xff09; 5. 管道实例 - 池类算法 1. 阻塞和非阻塞 IO 阻塞 IO&#xff1a;会等待操作的…

猫咪挑食怎么办?预防猫咪挑食的生骨肉冻干分享

在现今社会&#xff0c;养猫的人越来越多&#xff0c;大家都把自家的小猫当作宝贝来宠爱。然而&#xff0c;这种宠爱有时也会导致猫咪养成挑食的不良习惯。那么&#xff0c;猫咪挑食怎么办呢&#xff1f; 今天&#xff0c;我要分享一个既能确保猫咪不受苦&#xff0c;又能有效…

嵌入式学习第二十六天!(网络传输:TCP编程)

TCP通信&#xff1a; 1. TCP发端&#xff1a; socket -> connect -> send -> recv -> close 2. TCP收端&#xff1a; socket -> bind -> listen -> accept -> recv -> send -> close 3. TCP需要用到的函数&#xff1a; 1. co…

MySQL--索引底层数据结构详解

索引是什么&#xff1f; 索引是帮助MySQL高效获取数据的排好序的数据结构&#xff0c;因此可知索引是数据结构。 概念很抽象&#xff0c;但是类比生活中的例子就很容易理解&#xff0c;比如一本厚厚的书&#xff0c;我们想取找某一小节&#xff0c;我们可以根据目录去快速找到…

【Linux-文件管理】

Linux-文件管理 ■ mkdir&#xff08;创建文件夹&#xff09;■ rmdir&#xff08;删除目录&#xff09;■ touch&#xff08;文件创建&#xff09;■ rm&#xff08;删除文件或文件夹&#xff09;■ cp&#xff08;复制&#xff09;■ mv&#xff08;剪切&#xff09;■ tail■…

Python实现快速排序算法

Python实现快速排序算法 下面是使用 Python 实现的快速排序算法的示例代码&#xff1a; def quick_sort(arr):if len(arr) < 1:return arrelse:pivot arr[0]less_than_pivot [x for x in arr[1:] if x < pivot]greater_than_pivot [x for x in arr[1:] if x > pi…

Spring Boot中Excel数据导入导出的高效实现

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

基于SpringBoot+MYSQL的大学生租房平台

目录 1、 前言介绍 2、主要技术 3、系统流程 3.1、操作流程 3.2、登录流程 3.3、删除信息流程 3.4、添加信息流程 4、功能需求 5、系统设计 5.1、功能结构设计 5.1、数据库概念设计 6、运行截图(部分) 6.1、管理员功能实现 6.1.1、房东管理 6.1.2、信息审批管理 …

Springboot启动后想要做某些事可以通过什么方法实现?

在Spring Boot应用中&#xff0c;如果你想在应用启动完成后执行一些特定的操作&#xff08;例如缓存预热&#xff09;&#xff0c;可以实现CommandLineRunner或ApplicationRunner接口。这两个接口都提供了一个run方法&#xff0c;在Spring Boot应用上下文初始化完成后会被自动调…

Redis 配置文件详解

Units 单位 配置大小单位&#xff0c;开头定义了一些基本的度量单位&#xff0c;只支持bytes&#xff0c;不支持bit&#xff0c;大小写不敏感。 # Redis configuration file example. # # Note that in order to read the configuration file, Redis must be # started with …

java实现文件下载(前端传文件后端以流的方式进行输出)

其实文件的下载在前面的博客当中已经提到过了&#xff0c;但是本次单出一片博客的目的主要还是想把流程给理清楚&#xff0c;授人以鱼不如授人以渔对吧。 想要看文件上传的请跳转到前面一篇博文&#xff1a; java实现文件上传到本地 那接下来我们来看看具体的实现步骤吧~ 一…

聚观早报 | 腾讯QQ测试AI对话功能;哪吒L官宣4月交付

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 3月8日消息 腾讯QQ测试AI对话功能 哪吒L官宣4月交付 中国对瑞士等6国试行免签 Redmi K70至尊版细节曝光 Meta正…

IDEA自定义Maven仓库

Maven 是一款广泛应用于 Java 开发的工具&#xff0c;其作用类似于一个全自动的 JAR 包管理器&#xff0c;能够方便地导入开发所需的相关 JAR 包。在使用 Maven 进行 Java 程序开发时&#xff0c;开发者能够极大地提高开发效率。以下是关于如何安装 Maven 以及在 IDEA 中配置自…

【数据结构】二、线性表:1.顺序表的插入、删除、查找、特点

文章目录 1.3插入1.4删除1.5查找1.5.1按位查找1.5.2按值查找 1.6特点 1.3插入 把新的数据插入的目标位置之后&#xff0c;把目标位置后面的数据依次向后进行移动。 bool ListInsert(SqList &L,int i,int e){if(i<1||i>L.length1) //判断i的范围是否有效return fals…