我有来自服务器的目标网址,并希望通过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非常重要。
回复:正确且有权访问。
现在我在本地尝试使用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” 访问。
我激活Allow-Control-Allow-Origin
chrome扩展程序并再次运行它
这次它有效。但是没有访问权限,因为没有发送cookie。
回复:错误,无法访问。
将Cookie添加到Ajax请求标头:
beforeSend : function(xhr) {
xhr.setRequestHeader('Cookie', 'PHPSESSID=vjjuo34g4gh46ajd471lt8pvn7;');
},
未设置cookie并且错误出现在控制台中,错误:
拒绝设置不安全的标题“Cookie”
回复:错误,无法访问。
我们将此添加到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 !!!为什么?!
您会看到该请求包含所需的Cookie。但是data.responseText
和JavaScript没有收到正确的回复
但奇怪的是,Developer Tools> Network> Response
响应文本显示正确。
为什么会发生这种情况?如何才能最终获得正确的回复,例如上面第一张图片的CURL
请求?
修改
输出console.log(data)
命令。见这里:
好像红色的消息在这个时候被改变了!并且似乎还有一段时间在Chrome的Response
标签中加载响应数据失败了!
答案 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