我有一个Web应用程序,需要访问siteA和siteB(均在我的管理下)。在Web应用程序与siteA对话(并从siteA获取cookie)并跳转到siteB之后,它需要与siteA进行调用,但是即使我(通过cors)将siteA配置为信任siteB并允许凭据。
一直在谷歌上搜索和读取SO和其他站点上的文档,但是,我只是无法在HTTP请求中发送cookie。这是使用siteA进行API调用的JavaScript(在siteB的页面中运行,浏览器为chrome)
await (await fetch("http://siteA/api/1/greeting", {credentials: 'same-origin'})).text()
"Greetings from Spring Boot!"
这是上述javascript发送的HTTP请求。
GET /api/1/greeting HTTP/1.1
Host: siteA
Connection: keep-alive
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4117.2 Safari/537.36
Accept: */*
Origin: https://siteB
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
这是响应:
HTTP/1.1 200
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Access-Control-Allow-Origin: http://siteB
Access-Control-Allow-Credentials: true
Set-Cookie: jname=joe; HttpOnly
Content-Type: text/plain;charset=UTF-8
Content-Length: 27
Date: Sun, 26 Apr 2020 17:58:48 GMT
Keep-Alive: timeout=60
Connection: keep-alive
任何帮助或想法表示赞赏!
PS1:刷新siteA的网页时,可以从开发控制台中看到该请求具有cookie。
PS2:尝试在javascript代码段中使用
credentials: 'include'
,但该方法也不起作用。 最佳答案
您可以尝试将上面的代码更改为:await (await fetch("http://siteA/api/1/greeting", {credentials: 'include'})).text()
看到这里:https://javascript.info/fetch-crossorigin