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.hqwc.cn/news/518805.html

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

相关文章

【漏洞复现】-用友CRM系统存在逻辑漏洞直接登录后台

免责声明&#xff1a; 本文内容为学习笔记分享&#xff0c;仅供技术学习参考&#xff0c;请勿用作违法用途&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。任何个人和组织利用此文所提供的信息而造成的直接或间接后果和损失&#xff0c;…

Git 掌握

一、前言 大二上学期&#xff0c;学校开了数据库的课程&#xff0c;让做课程设计&#xff0c;数据库代码&#xff0c;文档等都搞好了&#xff0c;让老师看的时候文档写的不好&#xff0c;让修改&#xff0c;改了之后继续让老师看&#xff0c;来来回回弄了三四次&#xff0c;最…

LeetCode每日一题之 快乐数

目录 题目介绍&#xff1a; 算法原理&#xff1a; 鸽巢原理&#xff1a; 如何找到环里元素&#xff1a; 代码实现&#xff1a; 题目介绍&#xff1a; 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 算法原理&#xff1a; 我先简单举两个例子&#xff…

wsl 安装 ubuntu

文章目录 打开Windows PowerShell查看可安装的ubuntu安装相对应的ubuntu将用户添加到sudoers文件中&#xff0c;并赋予了该用户sudo权限。 打开Windows PowerShell 以管理员的身份运行 查看可安装的ubuntu wsl.exe --list --online安装相对应的ubuntu wsl --install 版本…

redis-集群 原生部署和工具自动部署

什么redis集群&#xff1f; redis集群是一个提供在多个redis节点之间共享数据的程序集。它并不像redis主从复制模式那样仅提供一个master节点来提供写服务&#xff0c;而是会提供多个master节点来提供写服务&#xff0c;每个master节点中存储的数据都不一样&#xff0c;这些数据…

★【二叉搜索树插入新的节点】【二叉搜索树】Leetcode 701. 二叉搜索树中的插入操作

【二叉搜索树插入新的节点】【二叉搜索树】Leetcode 701. 二叉搜索树中的插入操作 关键点&#xff1a;解法 递归法解法 迭代法 ---------------&#x1f388;&#x1f388;题目链接&#x1f388;&#x1f388;------------------- 关键点&#xff1a; 关键点&#xff1a; 二叉…

Java项目:41 springboot大学生入学审核系统的设计与实现010

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本大学生入学审核系统管理员和学生。 管理员功能有个人中心&#xff0c;学生管理&#xff0c;学籍信息管理&#xff0c;入学办理管理等。 学生功能有…

线上问题:新需求放量后频繁发生old gc

线上问题&#xff1a;新需求放量后频繁发生old gc 一、线上问题描述二、处理问题过程1、考虑机器扩容1.1 预发环境复现该问题1.2 预发环境机器扩容1.3 预发环境验证 2、堆内存分析2.1 内存分析2.2 问题修复 三、复盘 一、线上问题描述 周四上线了一个新需求&#xff0c;该需求…

教程篇:Groq API+沉浸式翻译插件 体验最快AI翻译

1、进入https://console.groq.com/keys 申请一个API&#xff08;目前免费&#xff01;抓紧白嫖&#xff09; 2、安装Chrome插件&#xff1a;沉浸式翻译。 https://immersivetranslate.com/ 3、照着抄&#xff08;注意将apikey&#xff0c;换成自己申请的groq的api-key&…

【linuxC语言】系统调用IO文件操作

文章目录 前言一、文件描述符介绍二、系统调用IO API介绍2.1 open函数2.2 close函数2.3 read函数2.4 write函数2.5 lseek函数 三、示例代码总结 前言 在Linux系统中&#xff0c;C语言通过系统调用实现对文件的输入输出&#xff08;I/O&#xff09;操作。系统调用提供了访问操作…

Docker连接Mysql

Docker连接mysql Docker通过云服务器&#xff0c;与本地连接 引言&#xff1a;这个东西我看狂神秒解决&#xff0c;我就试试了&#xff0c;结果G了&#xff0c;花了我两个小时&#xff0c; 希望内容能帮你解决问题 话不多说&#xff0c;直接上内容&#xff1a; navicat连接…

掌握计算机自动化:Pyperclip与CnOCR详细教程(最全使用方法,每行代码都有注释,帮你解决与之有关的所有问题)

文章目录 一、Pyperclip概念二、Pyperclip基础语法三、Pyperclip与文件交互四、Pyperclip生成随机密码五、OCR概念六、CnOCR 基础识别七、CnOCR 不同图片识别 在这个信息化快速发展的时代&#xff0c;高效的信息处理变得尤为关键。Python&#xff0c;作为一门强大的编程语言&am…