java - 为服务器自己的域设置 cookie
问题描述
我在客户端和服务器上工作。开发时,我的客户端在运行,http://localhost:3000/
而我的服务器运行在https://local.somedomain.com
. 服务器发送一个像
set-cookie: a=aB5Th....;Path=/;Expires=Sun, 02-Aug-2020 11:26:36 GMT;Max-Age=5184000
下载链接需要这个 cookie
https://local.somedomain.com/api/v2/ExportSomething.xlsx
但是,它不存在。由于服务器未指定域,因此可能有意义。OTOH,根据这个答案,“出于安全原因,您不能使用托管在另一个域上的 servlet 或 JavaScript 修改一个域的 cookie”,并且我不想为任何域设置任何 cookie,除了服务器运行,所以我问为什么在别无选择的情况下指定任何内容?
在 Chromium devtools 中过滤“已阻止 cookie”没有显示任何内容,我将其解释为“一切正常,cookies 通过”。我错了吗?
奇怪的是它曾经在一两个星期前工作过,至少在 Chromium 中(我非常确定这一点,因为我在导出上工作了几个小时)。现在它在我尝试过的四种浏览器中都不起作用。有什么解释吗?
假设在设置 cookie 时需要指定域,这个注释是否正确?
无聊的细节
- 每个请求都以相同的方式设置 cookie
- 上述下载链接之外的任何请求均不使用 cookie
- 显然需要 CORS 并且可以正常工作,并且每个请求都以相同的方式处理
- 不涉及其他服务器
更新
我刚刚尝试过cookie.setDomain("local.somedomain.com")
,这也是一个前导点,但没有帮助。
我还尝试省略Max-Age
(它也删除Expires
了自动添加的),但它也没有帮助(有人声称只有会话 cookie 在 localhost 上有效)。
解决方案
这种行为的可能原因(我能想到的):
- 浏览器设置拒绝所有第三方 cookie(如果 localhost 从 接收 cookie
local.somedomain.com
,则将被视为第三方) - 浏览器扩展阻止了 cookie
local.somedomain.com
服务器响应不包括允许localhost
接收 cookie所需的CORS 标头。(Access-Control-Allow-Origin 必须存在且未设置为“*”,Access-Control-Allow-Credentials 必须存在且“true”)- 谷歌在惹你生气
最后一点实际上不是开玩笑,而且很可能是这里的原因。谷歌一直在调整 Chromium 中 cookie 的“SameSite”规则,记录在这里:https ://www.chromium.org/updates/same-site
关于 SO 的一个相关案例:Confusion about SameSite changes with Chrome
推荐阅读
- scala - Scala可迭代集和sameElements
- java - 基于多个活动配置文件的 Spring 配置
- android - Webview 中 iframe 中的 .htaccess
- mysql - mysql 按多列排序,如果
- django - 有没有不教如何创建博客的初学者 Django 书?
- visual-studio - 从 Visual Studio 中的解决方案/项目中删除 VSTS 连接
- swift - 编译器无法将私有扩展中的方法识别为私有
- sql - SQL 数据迁移
- binding - 在同一 IIS 站点上根据端口号更改行为
- docker - 不同数据中心之间的 Docker 覆盖网络