POST 请求得到 405 响应,而不是由 access-denied-handler 处理

Posted

技术标签:

【中文标题】POST 请求得到 405 响应,而不是由 access-denied-handler 处理【英文标题】:POST request gets 405 response instead of being handled by access-denied-handler 【发布时间】:2017-04-16 02:29:03 【问题描述】:

这发生在同时使用 Spring Security 的 Spring MVC 应用程序中。我已经使用映射“/user/save”配置了请求,以便只有管理员可以访问它:

<intercept-url pattern="/user/save/**" access="hasAnyAuthority('ROLE_ADMIN')"/>
<intercept-url pattern="/user/**" access="hasAnyAuthority('ROLE_ADMIN','ROLE_OPERATOR'"/>

未经授权的请求由

处理
<access-denied-handler error-page="/denied"/>

当我发出只有ROLE_OPERATOR/user/save 请求时,我收到以下警告:

WARN http-nio-8080-exec-20 servlet.PageNotFound:208 - Request method 'POST' not supported

并且/denied 不会被击中。为什么?

对类似问题的回答建议为 POST 查询配置 csrf,但 POST 查询适用于 ROLE_ADMIN,所以这不应该是这里的问题。

我尝试在安全配置中指定方法类型,如下所示:

<intercept-url pattern="/user/save/**" access="hasAnyAuthority('ROLE_ADMIN')" method="GET"/>
<intercept-url pattern="/user/save/**" access="hasAnyAuthority('ROLE_ADMIN')" method="POST"/>

但它没有帮助。

拒绝访问处理程序在其他情况下正常工作,当请求的权限不足时会受到打击,因此这也不应该是问题的一部分。

什么可能导致这种行为?

【问题讨论】:

【参考方案1】:

就我而言,问题出在/denied 请求的控制器方法中。它有一个 GET 版本,但没有一个 POST 版本。添加这样的 POST 版本:

@RequestMapping(value = "/denied", method = RequestMethod.POST)
public @ResponseBody Response userAccessDeniedForPost() 
    ...

解决了问题。

【讨论】:

以上是关于POST 请求得到 405 响应,而不是由 access-denied-handler 处理的主要内容,如果未能解决你的问题,请参考以下文章

CORS 问题? - 预检响应包含无效的 HTTP 状态代码 405

从 POSTMAN 到我的 java api 的 POST 上的 405 响应代码

Spring MVC HTTP 状态 405 - 不支持请求方法“POST”

nginx静态html页面接收post请求,报405 not allowed错误

ApacheIISNginx等绝大多数web服务器,都不允许静态文件响应POST请求,否则会返回“HTTP/1.1 405 Method not allowed”错误。

来自 .net WCF 服务的 405 响应错误