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”错误。