如何判断为什么没有发送cookie?

时间:2015-06-16 20:37:10

标签: google-chrome http cookies google-chrome-devtools developer-tools

我正在使用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

7 个答案:

答案 0 :(得分:12)

我找到了一种查看为何未发送cookie的方法:

  • 转到“网络”标签,然后单击未与Cookie一起发送的请求。

  • 转到刚刚出现的“ Cookies”标签。

  • 选中“显示过滤出的请求cookie”以查看所有未发送的cookie,它们将显示为黄色。

然后,在阻止发送Cookie的属性旁边会出现一个小“ i”标签。您可以将鼠标悬停以查看详细信息。

答案 1 :(得分:3)

问题在于:

  

域= dev的;

引自RFC 2945

  

Domain属性的值指定域   cookie的有效期。如果是明确指定的值   不以点开头,用户代理提供一个前导点。

因此,如果主机地址以.dev.

结尾,则Web客户端将仅发送cookie

尝试发送不带域属性的cookie。

答案 2 :(得分:2)

这是Chrome特定的错误。还没有解决..

#56211 chrome.cookies对localhost域

失败
  

https://code.google.com/p/chromium/issues/detail?id=56211

也许还想阅读this question。这个问题并不特定于chrome,但它特定于localhost行为(与此问题不同)。

答案 3 :(得分:1)

如果您是跨域请求并使用XHR客户端(例如提取API),请注意withCredentials参数。

  

XMLHttpRequest.withCredentials属性是一个布尔值,指示是否应使用cookie,授权标头或TLS客户端证书之类的凭据发出跨站点访问控制请求。设置withCredentials不会影响同一站点的请求。

答案 4 :(得分:1)

我在未设置Cookie设置中指定; path=/的情况下设置Cookie时收到此错误。然后,我的Web服务器正在将某些请求路由到位于/的Web服务器上,并且未设置cookie,因为它仅对我最初设置它的/auth有效。

firefox screenshot of devtools

请注意,上面的Path是“ /auth”,在此处有效。在我的Cookie中设置路径后:

`nz_auth_jwt=${jwt}; path=/; expires=...` 

我在随后的请求中看到了我的cookie。并验证了开发工具中的路径是否已正确设置为对所有路径都有效,这正是我所需要的。

答案 5 :(得分:1)

就我而言,这是因为除非提供credentials: "include"作为选项,否则Fetch API不会发送cookie。

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));

答案 6 :(得分:0)

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会发布一个关于此的小日志通知。唉,它会给我们带来很大的悲伤。