将带有自定义cookie的Ajax请求发送到另一个域

时间:2017-11-16 22:05:34

标签: javascript jquery cookies cross-domain allow-same-origin

我有来自服务器的目标网址,并希望通过Ajax浏览器中的Chrome向其发送一些带有特定Cookie的参数。

目标网址的服务器的响应标头(我无法访问服务器以获取任何更改配置或更改其上的脚本)

Cache-Control:max-age=600, private, must-revalidate
Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection:keep-alive
Content-Encoding:gzip
Content-Length:6821
Content-Type:text/html
Date:Thu, 16 Nov 2017 22:50:17 GMT
Expires:Thu, 19 Nov 1981 08:52:00 GMT
Pragma:no-cache
Server:Apache
Vary:Accept-Encoding
X-Powered-By:PHP/5.5.38

我开始了! 首先,我尝试CURL进行测试访问。这样做是有效的,因此需要服务器访问,而无需设置特定的标题:

curl 'http://www.foo.com/bar.php' \
     -H 'Cookie: PHPSESSID=vjjuo34g4gh46ajd471lt8pvn7;' \
     --data 'x=1&y=2' --compressed -s

发送PHPSESSID Cookie非常重要。

回复:正确且有权访问。

请参阅:
pic01

现在我在本地尝试使用Ajax和Chrome浏览器:

$.ajax({
    type: "POST",
    ContentType: "application/json; charset=UTF-8",
    dataType: "json",
    data: {x : '1', y: '2'},
    url: 'http://www.foo.com/bar.php',
    complete: function(data) {
        console.log('RESPONSE TEXT>>>>>>>>', data.responseText);
    }
});

我收到以下错误消息:

  

无法加载http://www.foo.com/bar.php:否   请求中存在“Access-Control-Allow-Origin”标头   资源。因此不允许来源“http://localhost:8888”   访问。

请参阅:
pic02

我激活Allow-Control-Allow-Origin chrome扩展程序并再次运行它 这次它有效。但是没有访问权限,因为没有发送cookie。

回复:错误,无法访问。

请参阅:
pic03

将Cookie添加到Ajax请求标头:

beforeSend : function(xhr) {  
    xhr.setRequestHeader('Cookie', 'PHPSESSID=vjjuo34g4gh46ajd471lt8pvn7;');
},

未设置cookie并且错误出现在控制台中,错误:

  

拒绝设置不安全的标题“Cookie”

回复:错误,无法访问。

请参阅:
pic04

我们将此添加到Ajax请求中以允许我们添加cookie:

xhrFields: {
    withCredentials: true,
},

我的首选Cookie未设置,会发生什么。但是预先配置的cookie被设置为我所在域的请求域 (我们假设这些是不同问题的cookie。)
但这次控制台中会出现以下消息:

  

无法加载http://www.foo.com/bar.php:该值的值   响应中的“Access-Control-Allow-Origin”标头不能是   当请求的凭据模式为“include”时,为通配符'*'。起源   因此,“http://localhost:8888”不允许访问。该   XMLHttpRequest发起的请求的凭证模式是   由withCredentials属性控制。

回复:正确,但返回EMPTY !!!为什么?!

请参阅:
pic06
pic05

您会看到该请求包含所需的Cookie。但是data.responseText和JavaScript没有收到正确的回复 但奇怪的是,Developer Tools> Network> Response响应文本显示正确。

为什么会发生这种情况?如何才能最终获得正确的回复,例如上面第一张图片的CURL请求?

修改
输出console.log(data)命令。见这里:
pic07
好像红色的消息在这个时候被改变了!并且似乎还有一段时间在Chrome的Response标签中加载响应数据失败了!

1 个答案:

答案 0 :(得分:1)

在服务器中设置标头Access-Control-Allow-Origin。要使用AJAX从服务器接收响应,您需要向Access-Control-Allow-Origin标头添加一个不是通配符*的标头。

我可以看到你正在从你的本地主机进行测试。如果您设置Access-Control-Allow-Origin: http://localhost/,它就无法工作。如果您可以从服务器进行测试,它可能会有效。

您可以从拥有域名的网站进行测试,并在回复中添加Access-Control-Allow-Origin: domain

如果您需要有关此主题的更多信息,我建议您使用此网站:

https://developer.mozilla.org/es/docs/Web/HTTP/Access_control_CORS

相关问题