Spring 优雅关闭 - 不支持请求方法发布

Posted

技术标签:

【中文标题】Spring 优雅关闭 - 不支持请求方法发布【英文标题】:Spring graceful shutdown - REQUEST METHOD POST NOT SUPPORTED 【发布时间】:2016-12-15 12:48:34 【问题描述】:

我正在尝试使用 Spring endpoints 优雅地关闭我的应用程序,但出现错误:

2016-08-09 13:46:54.606  WARN 13315 --- [nio-8090-exec-6] .w.s.m.s.DefaultHandlerExceptionResolver : Handler execution resulted in exception: Request method 'POST' not supported

我正在使用this 指南,我已将application.properties 设置为endpoints.shutdown.enabled=trueendpoints.shutdown.sensitive=false。我还在 build.gradle 中包含了compile("org.springframework.boot:spring-boot-starter-actuator")

当我发送 CURL 请求时:curl -X POST https://localhost:8090/shutdown -k 我从服务器收到以下响应:

"timestamp":1470747537792,"status":405,"error":"Method Not Allowed","exception":"org.springframework.web.HttpRequestMethodNotSupportedException","message":"Request method 'POST' not supported","path":"/shutdown"

我做错了什么吗?有什么我可能会丢失的吗?我在整个应用程序中启用了 CSRF,因此不能为我的应用程序禁用它。

【问题讨论】:

不使用 POST 会怎样? "timestamp":1470748694304,"status":405,"error":"Method Not Allowed","exception":"org.springframework.web.HttpRequestMethodNotSupportedException","message":"Request method 'GET' not supported","path":"/shutdown" 【参考方案1】:

您需要发送一个 CSRF 令牌作为标头或参数或其他东西。你的例子:

curl -X POST https://localhost:8090/shutdown -k

不包含 CSRF 令牌,因此 Spring 会拒绝它。这确实是 CSRF 过滤器的重点。您将需要决定是否适合从该过滤器中排除 /shutdown uri,或者是否需要存在令牌/nonce。

【讨论】:

我知道 CSRF 是必需的,但是如何将 CSRF 令牌发送到 /shutdown URI?有没有办法生成令牌并将其作为参数发送?这不是我定义的请求映射,因为它是在 Spring 中预定义的,所以我对如何为请求提供标头感到困惑。【参考方案2】:

我用的是Springboot-1.5.3-RELEASE,使用http方式POST(不是GET)。可以。

【讨论】:

【参考方案3】:

如果你使用 spring-boot-starter-actuator:

我遇到了同样的问题,并将以下文本添加到 src/main/resources 文件夹中的 application.properties 文件中。

management.endpoint.shutdown.enabled=true
management.endpoints.web.exposure.include=health,info,shutdown

重建应用程序,运行它并发送请求(例如:localhost:8080/actuator/shutdown)

【讨论】:

【参考方案4】:

正如 david 所建议的,CSRF 是必需的,因为 Spring 的所有 POST 请求都需要它。所以我能想到绕过它的唯一方法是禁用 /shutdown 端点的 CSRF。

在我的SecurityConfig我设置:

http.csrf().ignoringAntMatchers("/shutdown");

这将/shutdown url禁用csrf保护,同时在应用程序的其余部分保持活动状态。

注意:此功能是在 Spring 4 中添加的。

【讨论】:

以上是关于Spring 优雅关闭 - 不支持请求方法发布的主要内容,如果未能解决你的问题,请参考以下文章

Spring,不支持请求方法“POST”[关闭]

SpringBoot 优雅停机

spring-boot 2 优雅关闭网络

错误 405 请求方法 'POST' 不支持 Spring Security

Spring:状态 405。不支持请求方法“POST”

HTTP状态405 - 不支持请求方法'POST' - Spring Security