我有一些麻烦的交叉来源资源共享和原型。我对外部资源有一个简单的post请求,对于一个简单的post请求,必须满足一些规则:
内容-类型必须在应用程序/x-www-窗体-urlencoded,多部分/表单-数据,或文本/纯文本,一个简单的请求不设置自定义头与http请求,而服务器必须设置访问控制-允许-源头正确。
使用普通的JavaScript XMLHttpRequest,一切都可以正常工作,但是对于PrototypeJS,它不能工作,因为它会接缝原型,设置一些自定义的标题,我不知道如何防止它。
我在原型中试用了:
new Ajax.Request('some.foreign-host.com/res.php', {
method: 'post',
postBody: 'foo=bar',
contentType: 'application/x-www-form-urlencoded',
onSuccess: function(e){
// some custom code
}
});知道如何得到原型来发送这样一个简单的CORS请求吗?
我有一个由普通的JavaScript XMLHttpRequest创建的头的转储
POST /bthesis/returnJSON.php HTTP/1.1
Host: foreign-host.com
Connection: keep-alive
Referer: this-host.com
Content-Length: 9
Origin: this-host.com
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Accept: */*
User-Agent: [...]
Accept-Encoding: gzip,deflate,sdch
Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3和由原型请求创建的标头
OPTIONS /bthesis/returnJSON.php HTTP/1.1
Host: foreign-host.com
Connection: keep-alive
Referer: this-host.com
Access-Control-Request-Method: POST
Origin: this-host.com
Access-Control-Request-Headers: X-Prototype-Version, X-Requested-With, Content-type, Accept
Accept: */*
User-Agent: [...]
Accept-Encoding: gzip,deflate,sdch
Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3原型使用完全不同的头集..。这将导致控制台中出现以下错误:
XMLHttpRequest无法加载Foreign-host.com/b证件/ load nJSON.php。请求标头字段X-原型-版本不允许访问-控制-允许-头.拒绝获得不安全的标头“X”
奇怪的是,see服务器在这两种情况下都返回请求的资源(我在开发人员控制台的'Resources‘视图中看到了它,但它连接到原型无法访问它。
发布于 2013-02-15 11:04:35
我也有同样的问题。@mplungjan shared的链接包含了答案:
您只需让浏览器知道x-json头通过使用access-control-expose-headers是安全的。
我在Rails控制器中使用这一行
headers['Access-Control-Expose-Headers'] = 'x-json'(这应该很容易翻译成其他编程语言:)
有关此页面的更多详细信息
发布于 2010-10-29 13:46:16
请看一下这里的航班前控制
您的问题是Fx正在响应自定义头(X-.)会触发预告。您需要让服务器返回选项和POST的所有访问控制标头,并让它允许自定义标头。
发布于 2013-03-21 12:48:46
我在其他问题上找到了解决方案。它对我有用-- 细节在这里。
总之--您需要在您的onCreate事件中删除非标准标头:
onCreate: function(response) { // here comes the fix
var t = response.transport;
t.setRequestHeader = t.setRequestHeader.wrap(function(original, k, v) {
if (/^(accept|accept-language|content-language)$/i.test(k))
return original(k, v);
if (/^content-type$/i.test(k) &&
/^(application\/x-www-form-urlencoded|multipart\/form-data|text\/plain)(;.+)?$/i.test(v))
return original(k, v);
return;
});
}https://stackoverflow.com/questions/3413762
复制相似问题