【问题标题】:Cross origin, cookies and session跨域、cookie 和会话
【发布时间】:2020-03-22 11:09:34
【问题描述】:

我想不出任何合适的标题。

我有两个网站在我的控制之下。域 A 和域 B。域 B 为域 A 设置所有必需的 CORS 标头。

域 A 向域 B 发出 ajax 请求。通过此请求,在域 B 上创建一个会话,并返回一个带有 jsessionid 的 cookie。

域 A 使用刚刚收到的 cookie 发出另一个 ajax 请求。在域 B 的会话上设置了一些值。这确实按预期工作。

然后,当我打开一个新选项卡并浏览到域 B 时,浏览器不会从 ajax 请求发送 cookie。这是为什么呢?

来自 ajax 请求的 cookie 是否只是暂时有效且仅对 ajax 请求有效?

额外测试

上述行为适用于 IE 11。我刚刚在最新的 Chrome 中进行了测试,但它根本不起作用。任何后续的 ajax 请求都不会发送任何 cookie。

示例请求:

$.ajax({
    url: url,
    success: function() {
        // do something
    },
    xhrFields: {
        withCredentials: true
    }
});

【问题讨论】:

    标签: jquery ajax cookies cross-domain


    【解决方案1】:

    在发出 AJAX 请求时尝试设置 withCredentials 标志:

    $.ajax({
        url: 'http://www.domainb.com/some-resource',
        type: 'GET',
        xhrFields: { withCredentials: true },
    });
    

    这将强制浏览器保留在跨域请求期间设置的 cookie,并在后续调用时自动发送。


    更新:

    我在这里设置了一个工作示例:https://jsfiddle.net/bhL0vqe3/4/

    【讨论】:

    • 正如我所说,第二个请求确实有效。 cookie 在第二个请求上设置。我在所有 ajax 请求上设置了 withCredentials。我怀疑cookie仅针对ajax请求而不是“常规”请求保留。这是我的问题。
    • 域B上的服务器是否也将Access-Control-Allow-Credentials响应头设置为true?您能否显示在此工作流程中通过网络发送的确切请求和响应负载?
    • 是的,否则第二个请求的行为会有所不同。
    • 不幸的是,我无法重现您在问题中描述的问题。你可以在这里看到这个工作:jsfiddle.net/bhL0vqe3/4。我在这个地址上设置了一个示例模拟 REST 服务器:https://www.mocky.io/v2/588b671a300000de1cfa8dfb。当被调用时,它将简单地返回 Set-Cookie: jsessionid=123;path=/ 响应头。因此,为了在新的私人会话中测试首次打开此地址https://www.mocky.io 并接受 SSL 证书警告。然后导航到发出 AJAX 请求的示例的 jsfiddle 地址。
    • 然后在新选项卡中再次打开https://www.mocky.io 地址,看到jsessionid cookie 在请求中发送。在发出 AJAX 请求时,您的服务器是否有可能为某些特定路径设置 jsessionid cookie。例如Set-Cookie: jsessionid=123;path=/abc?那么当你在根级别打开域B站点时,不会发送cookie,因为它只对/abc子路径有效?
    猜你喜欢
    • 2010-10-30
    • 2012-01-17
    • 1970-01-01
    • 2011-06-11
    • 2011-01-07
    • 2012-07-28
    • 2012-07-23
    • 2019-12-16
    • 2013-10-24
    相关资源
    最近更新 更多