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=true
和endpoints.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 优雅关闭 - 不支持请求方法发布的主要内容,如果未能解决你的问题,请参考以下文章