【问题标题】:Spring with Tomcat 7: PUT request returns 403 for strange resonsSpring with Tomcat 7:PUT 请求由于奇怪的原因返回 403
【发布时间】:2020-09-09 18:10:50
【问题描述】:

我有一个使用 Spring 3.1(未启动)编写并在 Tomcat 7 上运行的 Web 应用程序。

我有一个@Controller 在某个 URL 上实现方法 PUT。 在某些情况下,当从 Postman 发送 PUT 请求时,我得到的是 403 响应,而不是预期的响应。

例如:

  1. 将请求发送到未实现的 URL(在 GET 到相同的 URL 时我得到 404)
  2. 发送无效的 JSON 作为请求正文(预期为 400)
  3. 发送字符串而不是数字请求参数(预期 400)

我还实现了一个过滤器,它排除了所有请求,并且就在过滤器存在之前,我可以验证我从链的其余部分获得了预期的状态。

这是一个控制器代码示例:

@RequestMapping(value = "/{book}", method = RequestMethod.PUT)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
protected Book put(@PathVariable(value = "bookId") String id, @RequestBody @Valid Book book) {
    return book;  // just a stub
}

这是过滤器中的相关部分:

filterChain.doFilter(req, res);
// res.getStatus() is the expected status
return; // after this line I move to internal code of Tomcat which I cannot debug, but something happens there.

我错过了什么?

谢谢

【问题讨论】:

  • 您是否启用了 CSRF 保护?
  • 我不知道。为了测试,我使用了 maven tomcat 插件。如何查看?
  • 也可能是因为 'protected' 关键字无法访问。尝试更改为公开
  • Andreas,此链接涉及经理保护。这不是我的情况。公开该方法也没有奏效。这很奇怪,因为在正文中传递有效的 Book 对象时,它可以工作。但是当在正文中传递无效的 JSON 时,我希望我的验证器返回 400,但 Tomcat 会返回 403。

标签: java spring tomcat


【解决方案1】:
  1. 首先检查 CORS 过滤器配置,正如 Andreas 所说:https://tomcat.apache.org/tomcat-8.5-doc/config/filter.html
  2. 还可以查看此流程图https://tomcat.apache.org/tomcat-8.5-doc/images/cors-flowchart.png
  3. 最后看看这个stackoverflow帖子403 on JSON PUT request to Tomcat with Spring 3.0.5 and Jackson

【讨论】:

  • 感谢您的回答。似乎这些都与 CORS 无关。没有 Origin 标头。此外,当请求正文是有效的 JSON 时,PUT 请求返回 OK。当输入无效时,问题就开始了。
【解决方案2】:

您的路径变量值为bookId,但您的网址使用{book};两者都应该匹配。尝试将 url 更改为 "/{bookId}" 或将路径变量更改为 @PathVariable(value = "book")。知道您调用的 URL 可能有助于分析问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    相关资源
    最近更新 更多