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

news2024/10/24 22:25:06

前言

 

这是 最近碰到的一个问题, 大概是在 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 {

    @Bean
    public WebServerFactoryCustomizer containerCustomizer() {
        return new WebServerFactoryCustomizer<ConfigurableWebServerFactory>() {
            @Override
            public 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.coloradmin.cn/o/1497775.html

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

相关文章

buildadmim生成代码时让菜单有层级

当我们使用buildadmin生成代码的时候&#xff0c;在菜单的部分&#xff0c; 有时希望它生的是一个带有层级的菜单&#xff0c;有时候则想生成一个没有层级的菜单 like this 经过本人测试 如果我们要生成没有层级的菜单 我们可以在高级设置中的 相对位置处更改&#xff0c;同时…

某资产管理系统打点过程中的免杀经历

上周&#xff0c;被扔过来单位内部的一个链接&#xff0c;让渗透一下&#xff0c;本以为三下五除二很快就能测完&#xff0c;没想到在对抗杀软时费了一番功夫&#xff0c;再加上杂七杂八的事儿&#xff0c;经过了一个星期才测完(&#xff03;&#xffe3;&#xff5e;&#xff…

评估需求优先级的方法

Kano模型&#xff1a; 1.前言 在大量的需求需要进行迭代时&#xff0c;由于时间、人力、财力等相关因素干扰&#xff0c;无法在有限的时间内容对所有的需求进行满足&#xff0c;此时需要我们对需求进行优先级的排列。最大化的合理的提高有限资源的使用。 在常见的产品优先级…

应用案例 | Softing echocollect e网关助力汽车零部件制造商构建企业数据库,提升生产效率和质量

为了提高生产质量和效率&#xff0c;某知名汽车零部件制造商采用了Softing echocollect e多协议数据采集网关——从机器和设备中获取相关数据&#xff0c;并直接将数据存储在中央SQL数据库系统中用于分析处理&#xff0c;从而实现了持续监控和生产过程的改进。 一 背景 该企业…

【SpringBoot】-- 实现本地文件/图片上传到服务器生成url地址

在java项目中你可能会有以下需求&#xff1a;用户上传本地图片&#xff0c;然后展示在网页上。本篇文章将使用阿里云oss实现上传图片到oss&#xff0c;oss生成url。 一、准备工作 首先进入阿里云&#xff0c;按如下操作 进入创建页面&#xff0c;修改读写权限为公共读 然后进…

Pytorch入门实战 P1-实现手写数字识别

目录 一、前期准备&#xff08;环境数据&#xff09; 1、首先查看我们电脑的配置&#xff1b; 2、使用datasets导入MNIST数据集 3、使用dataloader加载数据集 4、数据可视化 二、构建简单的CNN网络 三、训练模型 1、设置超参数 2、编写训练函数 3、编写测试函数 4、…

蚂蚁感冒 刷题笔记

/* 解题思路 首先根据题意可知 1.蚂蚁速度均为1 即同向蚂蚁永远不可能追上 我们需要求最后感冒蚂蚁的数量 因为蚂蚁碰头将会掉头 效果和俩蚂蚁互相穿过继续走是一样的 所以我们将俩蚂蚁碰头视作穿过 2. 如果俩蚂蚁相向而行 则俩蚂蚁必定碰头 首先 我们获得第一个感冒蚂蚁的…

Requests教程-15-文件上传与下载

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节&#xff0c;我们学习了requests的HTTPS请求方法&#xff0c;本小节我们讲解一下在requests文件上传与下载。 文件上传 使用requests库上传文件时&#xff0c;需要使用files参数&#xff0c;并将文件打…

IDEA 配置文件乱码,项目编码设置

见下图 其中第一二项控制全局以及工程的编码格式&#xff0c;下方的则是 properties 配置文件的格式&#xff0c;统一调整为 UTF-8 后不再乱码

【Python学习篇】Python基础入门学习——你好Python(一)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;Vir2021GKBS &#x1f43c;本文由…

Android制作.9图回忆

背景 多年前&#xff0c;做app开发遇到IM需求&#xff0c;那会用到.9图做聊天气泡背景&#xff0c;现在总结下使用png图片制作.9图。方法有很多&#xff0c;这里主要介绍Android studio制作.9图。当然使用ps、draw9patch都行。 第一步、打开Android studio&#xff0c;切换到dr…

stm32学习笔记:I2C通信协议原理和软件I2C读写MPU6050

概述 第一块&#xff1a;介绍协议规则&#xff0c;然后用软件模拟的形式来实现协议。 第二块&#xff1a;介绍STM32的iic外设&#xff0c;然后用硬件来实现协议。 程序一现象&#xff1a;通过软件I2C通信&#xff0c;对MPU6050芯片内部的寄存器进行读写&#xff0c;写入到配…

Linux安装代理

Linux安装代理 1.下载安装包2.进行解压3.点击运行4.进行配置5.设置系统网络 1.下载安装包 2.进行解压 3.点击运行 4.进行配置 导入链接 5.设置系统网络 测试运行是否成功

迭代器失效问题(C++)

迭代器失效就是迭代器指向的位置已经不是原来的含义了&#xff0c;或者是指向的位置是非法的。以下是失效的几种情况&#xff1a; 删除元素&#xff1a; 此处发生了迭代器的失效&#xff0c;因为erase返回的是下一个元素的位置的迭代器&#xff0c;所以在删除1这个元素的时候&…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:浮层)

设置组件的遮罩文本。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 overlay overlay(value: string | CustomBuilder, options?: { align?: Alignment; offset?: { x?: number; y?: number } })…

Spring揭秘:BeanDefinitionRegistry应用场景及实现原理!

内容概要 BeanDefinitionRegistry接口提供了灵活且强大的Bean定义管理能力&#xff0c;通过该接口&#xff0c;开发者可以动态地注册、检索和移除Bean定义&#xff0c;使得Spring容器在应对复杂应用场景时更加游刃有余&#xff0c;增强了Spring容器的可扩展性和动态性&#xf…

GB 2312字符集:中文编码的基石

title: GB 2312字符集&#xff1a;中文编码的基石 date: 2024/3/7 19:26:00 updated: 2024/3/7 19:26:00 tags: GB2312编码中文字符集双字节编码区位码规则兼容性问题存储空间优化文档处理应用 一、GB 2312字符集的背景 GB 2312字符集是中国国家标准委员会于1980年发布的一种…

【Python】6. 基础语法(4) -- 列表+元组+字典篇

列表和元组 列表是什么, 元组是什么 编程中, 经常需要使用变量, 来保存/表示数据. 如果代码中需要表示的数据个数比较少, 我们直接创建多个变量即可. num1 10 num2 20 num3 30 ......但是有的时候, 代码中需要表示的数据特别多, 甚至也不知道要表示多少个数据. 这个时候,…

线上企业展厅:突破时空限制,展示企业实力的新平台

引言&#xff1a; 在数字化时代&#xff0c;企业宣传和展示已不再受限于传统的实体展厅。线上企业展厅作为一种创新的展示方式&#xff0c;不仅能够突破时空限制&#xff0c;还能充分利用多媒体技术&#xff0c;为企业带来更为丰富、立体的展示效果。 一、线上企业展厅的优势 …

YOLOv9中train.py与train_dual.py的异同!

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 首先&#xff0c;train.py&#xff08;左&#xff09;与train_dual.py(右)中的损失函数是不一样的&#xff0c;这也解释了为什么使用train.py除了填入…