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;大学所学的专业也非软件…

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;我们可以根据目录去快速找到…

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、信息审批管理 …

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 …

聚观早报 | 腾讯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 中配置自…

基于LSTM实现春联上联对下联

按照阿光的项目做出了学习笔记&#xff0c;pytorch深度学习实战项目100例 基于LSTM实现春联上联对下联 基于LSTM&#xff08;长短期记忆网络&#xff09;实现春联上联对下联是一种有趣且具有挑战性的任务&#xff0c;它涉及到自然语言处理&#xff08;NLP&#xff09;中的序列…

【Jemter】安装

1.准备前提工作 2.安装和卸载jdk 1&#xff09;安装双击jdk 2&#xff09;添加环境变量 此电脑–属性–高级系统设置–环境变量–系统变量–path删除/新建 C:\Program Files\Java\jdk-1.8\bin C:\Program Files\Java\jdk-1.8\jre 3&#xff09;验证 以防万一要卸载&#xff…

基于yolov5的铁轨缺陷检测系统,可进行图像目标检测,也可进行视屏和摄像检测(pytorch框架)【python源码+UI界面+功能源码详解】

功能演示&#xff1a; 基于yolov5的铁轨缺陷检测系统&#xff0c;系统既能够实现图像检测&#xff0c;也可以进行视屏和摄像实时检测_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于yolov5的铁轨缺陷检测系统是在pytorch框架下实现的&#xff0c;这是一个完整的项目…

Vue 使用Element Plus

1.官网安装 | Element PlusA Vue 3 based component library for designers and developershttps://element-plus.gitee.io/zh-CN/guide/installation.html#%E4%BD%BF%E7%94%A8%E5%8C%85%E7%AE%A1%E7%90%86%E5%99%A8 npm install element-plus --save2. 全局安装图标 npm ins…

连接kafka报错:java.io.IOException: Can‘t resolve address:

修改电脑host文件:C:\Windows\System32\drivers\etc\hosts 加上一行 192.168.1.XXX MHA_SLAVE2&#xff08;192.168.1.XXX 这个是安装kafka 的服务器地址&#xff0c;MHA_SLAVE2是kafka的容器id&#xff09;