Mag*_*tic 84 javascript jquery xmlhttprequest cors
我正在尝试制作一个Cross Origin帖子请求,并且我使用这样的普通Javascript工作:
var request = new XMLHttpRequest();
var params = "action=something";
request.open('POST', url, true);
request.onreadystatechange = function() {if (request.readyState==4) alert("It worked!");};
request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
request.setRequestHeader("Content-length", params.length);
request.setRequestHeader("Connection", "close");
request.send(params);
Run Code Online (Sandbox Code Playgroud)
但我想使用jQuery,但我无法让它工作.这就是我正在尝试的:
$.ajax(url, {
type:"POST",
dataType:"json",
data:{action:"something"},
success:function(data, textStatus, jqXHR) {alert("success");},
error: function(jqXHR, textStatus, errorThrown) {alert("failure");}
});
Run Code Online (Sandbox Code Playgroud)
这导致失败.如果有人知道为什么jQuery不起作用,请让我们都知道.谢谢.
(我正在使用jQuery 1.5.1和Firefox 4.0,我的服务器正在使用正确的Access-Control-Allow-Origin标头进行响应)
Wil*_*son 70
更新:正如TimK指出的那样,jquery 1.5.2不再需要这个.但是,如果您想添加自定义标头或允许使用凭据(用户名,密码或cookie等),请继续阅读.
我想我找到了答案!(4小时后诅咒很多)
//This does not work!!
Access-Control-Allow-Headers: *
Run Code Online (Sandbox Code Playgroud)
您需要手动指定您将接受的所有标题(至少在FF 4.0和Chrome 10.0.648.204中就是这种情况).
jQuery的$ .ajax方法为所有跨域请求发送"x-requested-with"标头(我认为它是唯一的跨域).
因此,响应OPTIONS请求所需的缺少标头是:
//no longer needed as of jquery 1.5.2
Access-Control-Allow-Headers: x-requested-with
Run Code Online (Sandbox Code Playgroud)
如果您传递任何非"简单"标题,则需要将它们包含在列表中(我再发送一个):
//only need part of this for my custom header
Access-Control-Allow-Headers: x-requested-with, x-requested-by
Run Code Online (Sandbox Code Playgroud)
所以把它们放在一起,这是我的PHP:
// * wont work in FF w/ Allow-Credentials
//if you dont need Allow-Credentials, * seems to work
header('Access-Control-Allow-Origin: http://www.example.com');
//if you need cookies or login etc
header('Access-Control-Allow-Credentials: true');
if ($this->getRequestMethod() == 'OPTIONS')
{
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
header('Access-Control-Max-Age: 604800');
//if you need special headers
header('Access-Control-Allow-Headers: x-requested-with');
exit(0);
}
Run Code Online (Sandbox Code Playgroud)
mon*_*sur 17
另一种可能性是设置dataType: json导致JQuery发送Content-Type: application/json标头.这被CORS视为非标准头,并且需要CORS预检请求.所以要尝试一些事情:
1)尝试配置服务器以发送正确的预检响应.这将是像附加头的形式Access-Control-Allow-Methods和Access-Control-Allow-Headers.
2)删除dataType: json设置.JQuery应该Content-Type: application/x-www-form-urlencoded默认请求,但只是为了确定,你可以替换dataType: json为contentType: 'application/x-www-form-urlencoded'
你在js中发送"params":
request.send(params);
但jquery中的"数据"".是否定义了数据?:
data:data,
此外,您在网址中有错误:
$.ajax( {url:url,
type:"POST",
dataType:"json",
data:data,
success:function(data, textStatus, jqXHR) {alert("success");},
error: function(jqXHR, textStatus, errorThrown) {alert("failure");}
});
Run Code Online (Sandbox Code Playgroud)
您正在将语法与$ .post的语法混合
更新:我根据monsur回答谷歌搜索,我发现你需要添加Access-Control-Allow-Headers: Content-Type(下面是完整段落)
http://metajack.im/2010/01/19/crossdomain-ajax-for-xmpp-http-binding-made-easy/
CORS如何工作
CORS的工作方式与Flash的crossdomain.xml文件非常相似.基本上,浏览器将向服务发送跨域请求,将HTTP头Origin设置为请求服务器.该服务包括一些标题,如Access-Control-Allow-Origin,用于指示是否允许此类请求.
对于BOSH连接管理器,通过将Access-Control-Allow-Origin的值设置为*,足以指定允许所有原点.Content-Type标头还必须在Access-Control-Allow-Headers标头中列入白名单.
最后,对于某些类型的请求,包括BOSH连接管理器请求,将预先进行权限检查.浏览器将执行OPTIONS请求并期望返回一些HTTP标头,这些标头指示允许哪些来源,允许哪些方法以及此授权将持续多长时间.例如,以下是我为OPTIONS返回的旁遮普和ejabberd补丁:
Run Code Online (Sandbox Code Playgroud)Access-Control-Allow-Origin: * Access-Control-Allow-Methods: GET, POST, OPTIONS Access-Control-Allow-Headers: Content-Type Access-Control-Max-Age: 86400