当我运行Spring应用程序,然后尝试与REST API通信时,它允许我GET,但不允许POST。
这是可行的:
curl -u user:a75fd7ea-9a6e-4943-bc0c-3b0a96bda51b http://localhost:5000/activity/getall
这不起作用:
curl -u user:a75fd7ea-9a6e-4943-bc0c-3b0a96bda51b
-H "Accept: application/json"
-X POST
-d '{
"name":"Sleep",
"criteria":"Sleep at least 8 hrs",
"ini":"2022-08-30",
"periodicity":"DAY",
"periodicityCount":"1"
}'
http://localhost:5000/activity/post
如果您注意到用户名和密码相同。
我得到的回答是:
HTTP/1.1 403
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Type: application/json
Transfer-Encoding: chunked
Date: Mon, 29 Aug 2022 19:25:27 GMT
Connection: close
{
"timestamp": "2022-08-29T19:25:27.510+00:00",
"status": 403,
"error": "Forbidden",
"path": "/activity/post"
}
1条答案
按热度按时间bis0qfac1#
API调用失败的原因是您在Spring Security配置中启用了CSRF保护。
其工作方式是,对于每个非GET请求(= POST、PUT、PATCH或DELETE),您需要包含一个CSRF令牌。
要获取CSRF令牌,首先需要触发GET请求(例如
http://localhost:5000/activity/getall
)。在响应标头中,您应该看到包含XSRF-TOKEN
cookie的Set-Cookie
标头。例如:现在,您需要复制
XSRF-TOKEN
cookie的值(应该包含UUID),并将其设置为X-XSRF-TOKEN
头的值:在此之后,您的请求应该会成功。请注意,此POST请求的响应将包含一个新的CSRF令牌,您必须将其复制到下一个请求中。
或者,您可以通过在Spring Security配置中设置
.csrf().disable()
来禁用CSRF保护。