【发布时间】:2020-09-09 18:10:50
【问题描述】:
我有一个使用 Spring 3.1(未启动)编写并在 Tomcat 7 上运行的 Web 应用程序。
我有一个@Controller 在某个 URL 上实现方法 PUT。 在某些情况下,当从 Postman 发送 PUT 请求时,我得到的是 403 响应,而不是预期的响应。
例如:
- 将请求发送到未实现的 URL(在 GET 到相同的 URL 时我得到 404)
- 发送无效的 JSON 作为请求正文(预期为 400)
- 发送字符串而不是数字请求参数(预期 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。