Ajax 调用 API 并传递 Set-Cookie

Ajax call to API and passing Set-Cookie

我正在访问 API,我必须先 post 登录。这是我传递的内容的示例,并且我获得了成功的连接:

$.ajax({
        type: 'POST',
        url: 'https://server:port/api/users/_login',
        contentType: 'application/x-www-form-urlencoded',
        dataType: 'xml',
        data: {username: "user", password: "userPassword"},
        success: function(data, textStatus, jqXHR){ alert(textStatus); },
        error: function(jqXHR, textStatus, errorThrown){ alert(textStatus); }
        });

这是 200 响应:

Access-Control-Allow-Headers:Content-Type
Access-Control-Allow-Methods:GET, POST, DELETE, PUT
Access-Control-Allow-Origin:*
Content-Length:125
Content-Type:application/xml
Date:Fri, 21 Oct 2016 08:49:21 GMT
Expires:Thu, 01 Jan 1970 00:00:00 GMT
Server:Jetty(9.2.14.v20151106)
Set-Cookie:JSESSIONID=h9823inizvhd2793nuqw7;Path=/api;Secure

任何后续调用都需要与 JSESSIONID 一起进行。所以我写了另一个调用如下 - 评论字段将向您展示我尝试过的和玩过的:

$.ajax({
            type: 'GET',
            url: 'https://server:port/api/datareq/guid/stats',
            dataType: 'xml',
            //crossDomain: true,
            xhrFields: { withCredentials: true },
            //data: data,
            success: function(data, textStatus, jqXHR){ alert(textStatus); },
            error: function(jqXHR, textStatus, errorThrown){ alert(textStatus);}
        });

如果我不包含 'withCredentials'(或将其设置为 false),我只会收到 401:通话未授权。但是,如果我确实使用该标志,我会收到此消息:

当凭据标志为真时,不能在 'Access-Control-Allow-Origin' header 中使用通配符“*”。因此不允许 Origin 'null' 访问。 XMLHttpRequest 的凭据模式由 withCredentials 属性控制。

现在我明白发生了什么,但我想不出解决办法。阅读了很多堆栈 posts 但没有真正起作用。不幸的是,我无权访问 api 网络服务器以在该方面进行任何更改,它是一个锁定的设备。我仍将四处寻找一些相关文章,但如果有人知道并且可以阐明一些解决方法,我们将不胜感激。

测试平台: Windows 8.1

浏览器: Chrome 53.0.2785.143(正式版)m(32 位)

不幸的是,您的浏览器的同源策略有问题,因此据我所知,您尝试解决它的方式无法解决。这意味着应该改变方法。这是我的建议:

  • 实施服务器端功能,该功能将根据您的客户端请求发送请求。此请求将针对目标 url
  • 服务器端函数应该获取目标站点的响应,并return它到浏览器
  • 请求您的函数而不是直接请求其他站点

因此,您的服务器端将用作绕过同源策略的代理。

https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy