【发布时间】:2020-09-22 02:49:19
【问题描述】:
我同时在客户端和服务器上工作。开发时,我的客户端在http://localhost:3000/ 上运行,而我的服务器在https://local.somedomain.com 上运行。服务器发送一个类似的cookie
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,根据this answer,“出于安全原因,您不能使用托管在另一个域上的 servlet 或 JavaScript 修改一个域的 cookie”,我不想设置任何除了服务器运行的域之外的任何域的 cookie,所以我问为什么在别无选择的情况下指定任何内容?
在 Chromium devtools 中过滤“已阻止 cookie”没有显示任何内容,我将其解释为“一切正常,cookie 通过”。 我错了吗?
奇怪的是,它曾经在一两个星期前工作过,至少在 Chromium 中是这样(我非常确定这一点,因为我在导出上工作了几个小时)。现在它在我尝试过的四种浏览器中都不起作用。 有什么解释吗?
假设设置cookie时需要指定域,this comment是否正确?
无聊的细节
- 每个请求都以相同的方式设置 cookie
- 上述下载链接以外的请求均不使用cookies
- 显然需要 CORS 并且可以正常工作,并且每个请求都以相同的方式处理
- 不涉及其他服务器
更新
我刚刚尝试过 cookie.setDomain("local.somedomain.com") 以及带有前导点的这个,但没有帮助。
我还尝试省略了Max-Age(这也删除了Expires,否则它会自动添加)但它也没有帮助(有人声称只有会话cookie在本地主机上有效)。
【问题讨论】:
-
afaik 如果您不需要设置域,cookie 将用于 local.somedomain.com。您在 Chrome 调试器的服务器响应中看到 cookie 是否正确,但在应用程序 -> Cookies -> local.somedomain.com 中没有?您是否有可能阻止某些内容的扩展程序?
-
@Simon 正确,我可以在“网络”选项卡(或使用 curl)中看到上面的 cookie,但在应用程序/cookies 中缺少它。我尝试了四个浏览器,其中两个是新安装的,所以没有扩展。
-
当您使用
--enable-file-cookies启动 Chrome 时,您能否快速检查是否有任何变化? -
所有 4 个浏览器都拒绝 cookie 的事实表明了更普遍的情况。您使用什么作为 HTTPS 的本地证书?您是否可能使用不受信任的 CA?
-
@Simon 我正在使用有效的 Let's Encrypt 证书,其获取方式与我们在生产中的方式相同。我虽然,为客户端使用
http://localhost:3000可能是罪魁祸首,但http://192.168.100.7:3000也不起作用。我还尝试使用纯 HTTP 访问服务器,如http://local.somedomain.com:10080和http://localhost:10080以及其他组合,均无效。
标签: java servlets cookies cors