如何判断未发送 cookie 的原因?
How to tell why a cookie is not being sent?
我正在使用 chrome,我想知道是否有扩展程序或方法来说明为什么未发送 cookie。
我向 http://dev/login
提出了一个请求,它正在返回,
Set-Cookie:DevId=cffbc7e688864b6811f676e181bc29e6; domain=dev; path=/; expires=Tue, 16-Jun-2015 21:27:43 GMT
但是,在 post 到 http://dev/Base/User/home/
上,我没有发送 DevId
cookie。如果有人碰巧知道,我很想知道为什么不发送 cookie。但是,此外,我很想知道我如何知道为什么以及将来如何更好地调试这个问题。
以下是从 Chrome 的开发工具
中捕获的一些请求
所以这是我来自 /login
的回复(注意 Set-Cookie header),
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
这是我的 post 到 /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
问题是这样的:
domain=dev;
引用自RFC 2945:
The value of the Domain attribute specifies the domain
for which the cookie is valid. If an explicitly specified value
does not start with a dot, the user agent supplies a leading dot.
因此,如果主机地址以 .dev.
结尾,Web 客户端只会发送 cookie
尝试发送没有域属性的 cookie。
这是一个 Chrome 特定的错误。还没有修复..
#56211 chrome.cookies 本地主机域失败
可能还想读this question。它不像这个问题那样特定于 chrome,但它特定于本地主机的行为(与这个问题不同)。
Evan Carroll 链接到 chromium 的问题(现在重定向到这里:https://bugs.chromium.org/p/chromium/issues/detail?id=56211)似乎相关,并被标记为 "Fixed"。不过,目前还不是很清楚。
我遇到了 /etc/hosts 中的主机条目问题,例如:
127.0.0.1 local.app.service.tld
但是改成
之后
127.0.0.1 app.localhost
它再次按预期运行。我认为 chrome 会在它发生时发布一个关于此的小日志通知。唉,这会让我们所有人免去很多悲伤。
如果您正在进行跨域请求并使用 XHR 客户端(如提取 API),请注意 withCredentials 参数。
The XMLHttpRequest.withCredentials property is a Boolean that indicates whether or not cross-site Access-Control requests should be made using credentials such as cookies, authorization headers or TLS client certificates. Setting withCredentials has no effect on same-site requests.
我在设置 cookie 时收到此错误,但未在我的 cookie 设置中指定 ; path=/
。然后我的网络服务器将某些请求路由到我在 /
的网络服务器并且未设置 cookie,因为它仅对我最初设置它的 /auth
有效。
请注意,上面的 Path
是“/auth
”,这是它有效的地方。在我的 cookie 中设置路径后:
`nz_auth_jwt=${jwt}; path=/; expires=...`
我在后续请求中看到了我的 cookie。并验证了开发工具中的路径是否被正确设置为对所有路径都有效,这正是我想要的。
如何判断未发送 cookie 的原因:
转到网络选项卡,然后单击未随 cookie 一起发送的请求。
转到刚刚出现的“Cookies”选项卡。
选中“显示过滤掉的请求 cookie”以查看所有未发送的 cookie,它们将以黄色显示。
然后 属性 旁边会出现一个小的“i”标签,阻止发送 cookie。您可以将鼠标悬停在上面查看详细信息:
在我的例子中,这是因为 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));
截至 2022 年 Chrome...
在开发者工具 > 网络选项卡 > Headers > 响应 中,您可以看到未设置 cookie 的原因。
我正在使用 chrome,我想知道是否有扩展程序或方法来说明为什么未发送 cookie。
我向 http://dev/login
提出了一个请求,它正在返回,
Set-Cookie:DevId=cffbc7e688864b6811f676e181bc29e6; domain=dev; path=/; expires=Tue, 16-Jun-2015 21:27:43 GMT
但是,在 post 到 http://dev/Base/User/home/
上,我没有发送 DevId
cookie。如果有人碰巧知道,我很想知道为什么不发送 cookie。但是,此外,我很想知道我如何知道为什么以及将来如何更好地调试这个问题。
以下是从 Chrome 的开发工具
中捕获的一些请求所以这是我来自 /login
的回复(注意 Set-Cookie header),
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
这是我的 post 到 /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
问题是这样的:
domain=dev;
引用自RFC 2945:
The value of the Domain attribute specifies the domain for which the cookie is valid. If an explicitly specified value does not start with a dot, the user agent supplies a leading dot.
因此,如果主机地址以 .dev.
尝试发送没有域属性的 cookie。
这是一个 Chrome 特定的错误。还没有修复..
#56211 chrome.cookies 本地主机域失败
可能还想读this question。它不像这个问题那样特定于 chrome,但它特定于本地主机的行为(与这个问题不同)。
Evan Carroll 链接到 chromium 的问题(现在重定向到这里:https://bugs.chromium.org/p/chromium/issues/detail?id=56211)似乎相关,并被标记为 "Fixed"。不过,目前还不是很清楚。
我遇到了 /etc/hosts 中的主机条目问题,例如:
127.0.0.1 local.app.service.tld
但是改成
之后127.0.0.1 app.localhost
它再次按预期运行。我认为 chrome 会在它发生时发布一个关于此的小日志通知。唉,这会让我们所有人免去很多悲伤。
如果您正在进行跨域请求并使用 XHR 客户端(如提取 API),请注意 withCredentials 参数。
The XMLHttpRequest.withCredentials property is a Boolean that indicates whether or not cross-site Access-Control requests should be made using credentials such as cookies, authorization headers or TLS client certificates. Setting withCredentials has no effect on same-site requests.
我在设置 cookie 时收到此错误,但未在我的 cookie 设置中指定 ; path=/
。然后我的网络服务器将某些请求路由到我在 /
的网络服务器并且未设置 cookie,因为它仅对我最初设置它的 /auth
有效。
请注意,上面的 Path
是“/auth
”,这是它有效的地方。在我的 cookie 中设置路径后:
`nz_auth_jwt=${jwt}; path=/; expires=...`
我在后续请求中看到了我的 cookie。并验证了开发工具中的路径是否被正确设置为对所有路径都有效,这正是我想要的。
如何判断未发送 cookie 的原因:
转到网络选项卡,然后单击未随 cookie 一起发送的请求。
转到刚刚出现的“Cookies”选项卡。
选中“显示过滤掉的请求 cookie”以查看所有未发送的 cookie,它们将以黄色显示。
然后 属性 旁边会出现一个小的“i”标签,阻止发送 cookie。您可以将鼠标悬停在上面查看详细信息:
在我的例子中,这是因为 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));
截至 2022 年 Chrome...
在开发者工具 > 网络选项卡 > Headers > 响应 中,您可以看到未设置 cookie 的原因。