首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于PrototypeJS的跨源资源共享

基于PrototypeJS的跨源资源共享
EN

Stack Overflow用户
提问于 2010-08-05 10:20:07
回答 4查看 13.6K关注 0票数 5

我有一些麻烦的交叉来源资源共享和原型。我对外部资源有一个简单的post请求,对于一个简单的post请求,必须满足一些规则:

内容-类型必须在应用程序/x-www-窗体-urlencoded,多部分/表单-数据,或文本/纯文本,一个简单的请求不设置自定义头与http请求,而服务器必须设置访问控制-允许-源头正确。

使用普通的JavaScript XMLHttpRequest,一切都可以正常工作,但是对于PrototypeJS,它不能工作,因为它会接缝原型,设置一些自定义的标题,我不知道如何防止它。

我在原型中试用了:

代码语言:javascript
复制
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创建的头的转储

代码语言:javascript
复制
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

和由原型请求创建的标头

代码语言:javascript
复制
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‘视图中看到了它,但它连接到原型无法访问它。

EN

回答 4

Stack Overflow用户

发布于 2013-02-15 11:04:35

我也有同样的问题。@mplungjan shared的链接包含了答案:

您只需让浏览器知道x-json头通过使用access-control-expose-headers是安全的。

我在Rails控制器中使用这一行

代码语言:javascript
复制
  headers['Access-Control-Expose-Headers'] = 'x-json'

(这应该很容易翻译成其他编程语言:)

有关此页面的更多详细信息

票数 11
EN

Stack Overflow用户

发布于 2010-10-29 13:46:16

请看一下这里的航班前控制

您的问题是Fx正在响应自定义头(X-.)会触发预告。您需要让服务器返回选项和POST的所有访问控制标头,并让它允许自定义标头。

票数 1
EN

Stack Overflow用户

发布于 2013-03-21 12:48:46

我在其他问题上找到了解决方案。它对我有用-- 细节在这里

总之--您需要在您的onCreate事件中删除非标准标头:

代码语言:javascript
复制
    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; 
        }); 
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3413762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档