如何判断为啥没有发送 cookie?
Posted
技术标签:
【中文标题】如何判断为啥没有发送 cookie?【英文标题】:How to tell why a cookie is not being sent?如何判断为什么没有发送 cookie? 【发布时间】:2015-09-01 20:51:08 【问题描述】:我正在使用 chrome,我想知道是否有扩展程序或方法来说明未发送 cookie 的原因。
我向http://dev/login
提出了一个请求,它正在返回,
Set-Cookie:DevId=cffbc7e688864b6811f676e181bc29e6; domain=dev; path=/; expires=Tue, 16-Jun-2015 21:27:43 GMT
但是,在发给 http://dev/Base/User/home/
的帖子中,我不会发送 DevId
cookie。如果有人碰巧知道,我很想知道为什么不发送 cookie。但是,此外,我很想知道如何知道为什么以及将来如何更好地调试此问题。
以下是从 Chrome 的开发工具中捕获的一些请求
这是我来自/login
的回复(注意 Set-Cookie 标头),
HTTP/1.1 200 OK
Date: Tue, 16 Jun 2015 19:57:43 GMT
Server: Apache
Pragma: no-cache
Cache-control: no-cache, max-age=0
Set-Cookie: DevId=cffbc7e688864b6811f676e181bc29e6; domain=dev; path=/; expires=Tue, 16-Jun-2015 21:27:43 GMT
Cache-Control: max-age=0
Expires: Tue, 16 Jun 2015 19:57:43 GMT
Keep-Alive: timeout=10, max=10
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/json; charset=ISO-8859-1
这是我发给/Base/User/home/1
的帖子(注意没有cookie),
POST /Base/User/home/ HTTP/1.1
Host: dev
Connection: keep-alive
Content-Length: 0
Origin: http://dev
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (Khtml, like Gecko) Ubuntu Chromium/43.0.2357.81 Chrome/43.0.2357.81 Safari/537.36
Content-type: application/x-www-form-urlencoded; charset=UTF-8
Accept: text/javascript, text/html, application/xml, text/xml, */*
X-Prototype-Version: 1.7.2
X-Requested-With: XMLHttpRequest
Referer: http://dev/user/1/home
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.8
【问题讨论】:
您可以验证是否在“资源”选项卡中设置了 cookie - i.imgur.com/4W57ztA.png。如果不是,我们需要一个工具来验证您发送的标头。 我已确认 cookie 未在发布请求标题下的网络选项卡中发送。但是,cookie 不是在资源选项卡下设置的事件。 【参考方案1】:问题是这样的:
域=开发;
引用RFC 2945:
Domain 属性的值指定域 cookie 对其有效的对象。如果明确指定的值 不以点开头,用户代理提供前导点。
所以web客户端只会在主机地址以.dev.
结尾时发送cookie
尝试发送不带域属性的 cookie。
【讨论】:
这在 Firefox 中有效,但这不是它应该如何工作的。至少根据this post。用户代理应该“提供”点,所以它写成.dev
,它应该在dev
和dev
的任何子域上提交cookie。【参考方案2】:
这是 Chrome 特有的错误。还没有修复..
#56211 localhost 域的 chrome.cookies 失败
https://code.google.com/p/chromium/issues/detail?id=56211
可能还想阅读this question。它不是像这个问题那样特定于 chrome,而是特定于 localhost 行为(与这个问题不同)。
【讨论】:
然而,当我使用 隐身模式 或其他 Chrome 配置文件时,它可以工作。所以我很困惑为什么这只是我正常 Chrome 配置文件中的一个问题。【参考方案3】:Evan Carroll 链接到的铬问题(现在在此处重定向:https://bugs.chromium.org/p/chromium/issues/detail?id=56211)似乎相关,并标记为“已修复”。不过,目前还不是很清楚。
我遇到了 /etc/hosts 中的主机条目问题,如下所示:
127.0.0.1 local.app.service.tld
但是改成之后
127.0.0.1 app.localhost
它再次按预期工作。我认为当它发生时,chrome 会很好地发布一个关于这个的日志通知。唉,这会为我们所有人省去很多悲伤。
【讨论】:
【参考方案4】:如果您处理跨域请求并使用 XHR 客户端(如 fetch API),请注意 withCredentials 参数。
XMLHttpRequest.withCredentials 属性是一个布尔值,指示是否应使用 cookie、授权标头或 TLS 客户端证书等凭据进行跨站点访问控制请求。设置 withCredentials 对同站点请求没有影响。
【讨论】:
【参考方案5】:我在设置 cookie 时收到此错误,但未在我的 cookie 设置中指定 ; path=/
。然后我的网络服务器将某些请求路由到/
的网络服务器,并且没有设置 cookie,因为它仅对我最初设置的 /auth
有效。
请注意,上面的Path
是“/auth
”,这是它的有效位置。在我的 cookie 中设置路径后:
`nz_auth_jwt=$jwt; path=/; expires=...`
我在后续请求中看到了我的 cookie。并验证开发工具中的路径已正确设置为对所有路由都有效,这正是我想要的。
【讨论】:
【参考方案6】:如何判断为什么没有发送 cookie:
转到网络选项卡,然后单击未与您的 cookie 一起发送的请求。
转到刚刚出现的“Cookies”标签。
选中“显示过滤掉的请求 cookie”以查看所有未发送的 cookie,它们将显示为黄色。
然后会在阻止发送 cookie 的属性旁边出现一个小的“i”标签。您可以将鼠标悬停在上面查看详细信息。
【讨论】:
谢谢,我从 3 天开始就一直在寻找这个。 对于有问题的请求,我发现 Cookies 选项卡没有出现。 @skainswo 这可能会对您有所帮助:https://***.com/questions/55414344/chrome-network-request-does-not-show-cookies-tab-some-request-headers-copy-as。虽然那里的答案对我不起作用。 你是真正的 MVP 兄弟【参考方案7】:在我的情况下,这是因为 Fetch API 不会发送 cookie,除非credentials: "include"
作为选项提供。
fetch('API_ENDPOINT',
method: 'POST',
credentials: 'include',
body: JSON.stringify(some_json_obj)
)
另外,我必须配置 Node.js ( express.js ) 后端 CORS,如下所示。
const cors = require('cors')
const corsOptions =
origin: 'http://localhost:3000',
credentials: true
app.use(cors(corsOptions));
【讨论】:
【参考方案8】:Chrome 中截至 2022 年...
在开发者工具>网络选项卡>标题>响应你可以看到为什么没有设置cookies。
【讨论】:
以上是关于如何判断为啥没有发送 cookie?的主要内容,如果未能解决你的问题,请参考以下文章