【问题标题】:Set-Cookie (from AJAX) header not setting cookie in browserSet-Cookie(来自 AJAX)标头未在浏览器中设置 cookie
【发布时间】:2018-10-26 03:20:51
【问题描述】:

我有一个使用 Web API 的单页应用程序。当用户登录时,我希望服务器设置一个 cookie 以便进一步识别。

AJAX 请求显然是 HTTP,只有一个小的标识头。据我所知,浏览器的代理不应该区分XMLHttpRequest 和正常请求。特别是因为我使用的是相对较旧的 Firefox 版本。

应用网址:http://sub.domain.com/app API 请求:http://sub.domain.com/service/method

域和子域完全相同。没有尝试更改其他域的 cookie。

如您所见,cookie 被浏览器的请求解析器识别。即使在搜索了 SO 和 Google 之后,我也没有找到一个合乎逻辑的解释来解释为什么这不是设置 cookie。

尝试了一堆不同的 Set-Cookie 参数组合。我认为最稳定的语法是key=value; expires=date; domain=.domain.com,这就是我在上面示例中使用的语法。

附: 我使用的是实际域和子域,而不是 localhost。 使用相对较旧且稳定的 Firefox 版本。

【问题讨论】:

  • 你会分享你用来设置cookie的代码吗?
  • @junkangli 代码都是验证逻辑,我只是​​在响应中添加了 Set-Cookie HTTP 标头,就像key=value; expires=date; domain=.domain.com...
  • 我可以检查一下您是如何验证未设置 cookie 的吗?
  • @junkangli 我用这个 Firefox Cookie Manager -> addons.mozilla.org/en-US/firefox/addon/a-cookie-manager
  • @fingeron,对我提供的答案有任何反馈吗?

标签: ajax http cookies setcookie


【解决方案1】:

我认为您的问题在这里得到了很好的解释

How does a browser handle cookie with no path and no domain

对于没有路径属性的Set-Cookie,RFC6265 声明:

如果服务器省略了 Path 属性,用户代理将使用 request-uri 的路径组件的“目录”作为默认值。

因此,您还需要在您的服务器上设置 path=/ 以确保每个人都可以访问 cookie

Edit-1

还要确保您的网页和 API 都在相同的协议上运行。因为如果 cookie 被标记为安全,那么 http url 将无法读取相同的内容

【讨论】:

  • 对不起!经过大量的试验和错误后,我意识到这个问题不幸地有点愚蠢并且有点羞耻。我使用的网站在 HTTP 上运行,而 API 请求在 HTTPS 中。我不敢相信我花了这么长时间才意识到。尽管如此,“路径”提示绝对是一个很好的提示。因此,仅供以后参考,也请将此添加到您的答案中。非常感谢!
【解决方案2】:

出现问题的原因有两个:

  1. Set-Cookie 标头从 HTTPS 请求返回到 HTTP 网站。
  2. “路径”属性未设置,因此默认为 API URI 的路径(如 Tarun Lalwani 所述)。

最终起作用的语法是:

Set-Cookie: test=working; Domain=.domain.com; Path=/; Secure

【讨论】:

    猜你喜欢
    • 2014-08-24
    • 2015-09-12
    • 1970-01-01
    • 2020-08-16
    • 2021-11-03
    • 2019-11-12
    • 2012-05-02
    • 1970-01-01
    • 2014-11-14
    相关资源
    最近更新 更多