我在[site2] /page.html上使用script
标记加载[site1] /script.js。
并且浏览器在请求JS文件时不发送cookie。
回复标题:
HTTP/1.1 200 OK Server: nginx Date: Thu, 02 Apr 2015 14:45:38 GMT Content-Type: application/javascript Content-Length: 544 Connection: keep-alive Content-Location: script.js.php Vary: negotiate,Accept-Encoding TCN: choice Set-Cookie: test_id=551d5612406cd; expires=Sat, 02-Apr-2016 14:45:38 GMT; path=/ Content-Encoding: gzip
请求标头 - 没有cookie:
GET /script.js HTTP/1.1 Host: [site1] Connection: keep-alive Cache-Control: max-age=0 Accept: */* User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36 Referer: [site2]/page.html Accept-Encoding: gzip, deflate, sdch Accept-Language: ru,en-US;q=0.8,en;q=0.6,sk;q=0.
答案 0 :(得分:5)
浏览器执行在请求JavaScript文件时发送Cookie,就像在请求其他任何内容时一样。并且适用相同的规则:cookie必须是原点/路径。在您的示例中,您似乎使用了两个不同的来源(site1
和site2
),这可以解释您在请求中看不到Cookie的原因。
例如:我在服务器上设置了一个名为test.php
的页面,用于设置cookie。然后它会有test2.html
的链接,其中包含foo.js
。这些都在同一条路径上(/
,在我的例子中,因为我很懒,并且没有为测试创建一个子目录。)
在浏览器获取test.php
时的响应标题中,我看到了
Set-Cookie:test=123
如果我点击test2.html
,我会在test2.html
的请求标题中看到这一点:
Cookie:test=123
然后我看到foo.js
的请求,并在该请求中看到:
Cookie:test=123
答案 1 :(得分:1)
对不起,这是我的错。谷歌浏览器阻止了第三方cookie。
默认情况下,浏览器会发送带有JavaScript文件请求的Cookie。
答案 2 :(得分:1)
在特殊情况下,即使来源相同,也不会发送Cookie:加载ES6模块时!
<script type="module" src="some-script.js"></script>
这不会发送cookie,因此如果您的服务器需要对请求进行身份验证,则可能会失败。
作为this excellent article points out,您需要通过添加以下内容来明确要求发送凭据
crossorigin
属性:
<script type="module" crossorigin src="some-script.js"></script>
此行为目前被认为是错误(没有任何意义,对吗?),并且已在所有主流浏览器中修复。有关更多详细信息,请参见上面的链接。