Spring Boot 返回 405 而不是 404 用于 POST 到未知 URL

Posted

技术标签:

【中文标题】Spring Boot 返回 405 而不是 404 用于 POST 到未知 URL【英文标题】:Spring Boot Returning 405 instead of 404 for POST to unknown URL 【发布时间】:2015-05-07 13:51:45 【问题描述】:

免责声明:我是 Java、Spring 和 Spring Boot 的新手。

我想让 Spring Boot 在尝试 POST 到不存在的 URL 时返回 404。但是,现在它返回一个 405,带有一个只包含 GET 和 HEAD 的 Allow 标头。有没有办法自定义允许哪些 HTTP 方法以便我得到 404?我已经尝试实现自定义 ErrorController,但这似乎不起作用。

要明确:这是当我发布到一个不应与我定义的端点任何匹配的 URL 时,例如 http://example.com/some-bogus-thing p>

如果需要更多信息来诊断此问题,我很乐意提供。由于我对平台不熟悉,我不确定什么是相关的。

【问题讨论】:

你需要用@RequestMapping注解你的方法,并将method属性设置为想要的类型。 创建一个MCVE 并发布代码。我可以重现这种确切的行为,但我无法解释它,这就是为什么评论而没有答案。 我也看到了这一点,提问者是正确的。查看源代码,似乎只有对无效 URL 的 GET 请求才返回 404。对于所有其他请求,无论出于何种原因,框架默认返回 405。 【参考方案1】:

HTTP 405 (Method not found) 被返回,when URL exists 并且您尝试使用该特定 URL 映射上不允许的 HTTP 方法。

如果您在.../test 下方调用 POST,那么它将返回 HTTP 405,反之亦然。

@RequestMapping(value = "/test", method = RequestMethod.GET)

如果没有任何 HTTP 方法的 URL 映射,那么它将返回 HTTP 404。

要了解该特定启动实例上的所有当前映射,只需转到浏览器

http://localhost:8080/mappings

【讨论】:

是的,您描述的情况是我想要返回 405。但是,我的情况是当我发布到一个 的 URL存在。我希望它是 404,但 Spring Boot 返回的是 405。 这是不可能的。如果没有 URL 映射,则返回 404。如果返回 405,则表示有映射。使用来自localhost:8080/mappings 的映射进行交叉检查。 当我转到 localhost:8080/mappings 时,我在顶部看到一个带有粉红色错误消息的页面,上面写着:This page contains the following errors: error on line 1 at column 25: expected '>' Below is a rendering of the page up to the first error. 这是要渲染的模板是什么?我可以纠正它,但我不知道在哪里看。 k139 是正确的。如果没有可用的 URL 映射,它将返回 404。如果您尝试使用错误的 HTTP 方法来调用控制器方法,则会得到 405。此外,您需要共享相关代码,以便人们可以帮助您。它在黑暗中拍摄。 我也看到了这一点,提问者是正确的。查看源代码,似乎只有对无效 URL 的 GET 请求才返回 404。对于所有其他请求,无论出于何种原因,框架默认返回 405。【参考方案2】:

检查这里: https://github.com/spring-projects/spring-boot/issues/4876

解决方案是进行如下设置: 春天: MVC: 静态路径模式:/static/**

【讨论】:

这对我来说是一个很好的线索。可能有一些通用处理程序混淆了这个问题。就我而言,它与自定义 ErrorController 有关。 405 响应包括 Allow: GET,但执行 GET 会返回 404。link 表明已修复此问题,但看起来还没有。【参考方案3】:

如果有人仍然遇到此问题: 这是spring framework 4.2.4的一个bug,请参考https://github.com/spring-projects/spring-framework/issues/18516 正如它所说,自 4.3 RC1 以来,此问题已得到修复。

【讨论】:

以上是关于Spring Boot 返回 405 而不是 404 用于 POST 到未知 URL的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 2 Actuator 端点在 GET 请求上返回 405

为啥 Spring Boot Actuator 返回 404 而不是 401?

为啥 Spring Boot 返回一个字符串而不是 JSON

spring boot 返回字符串而不是 .html 文件

Spring Boot 返回字符串而不是视图

对于未经身份验证的请求,Keycloak spring boot 返回 403 而不是 401