【问题标题】:jQuery and Cross Domain POST RequestsjQuery 和跨域 POST 请求
【发布时间】:2011-08-19 23:23:22
【问题描述】:

我正在开发一个 jQuery 插件,它将成为一些 REST API 的连接器。 实施是直截了当的,但同源政策绝对是痛苦的。 我主要需要执行 POST 请求。

我也试过实现OPTIONS方法并返回(是python,但意思应该清楚)

def options(self):
  self.response.headers['Access-Control-Allow-Origin'] = self.request.host_url
  self.response.headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS'
  self.response.headers['Access-Control-Allow-Headers'] = 'x-requested-with'
  self.response.headers['Access-Control-Max-Age'] = '1728000'

还是不行……有什么办法吗?

PS:我看到有其他类似主题的问题,但我需要一个针对 POST 方法的特定解决方案(使用 iframe 可以轻松实现 GET)

Javascript 示例:

$.ajax({
    url: options.protocol+'://'+options.host+':'+options.port+'/'+method,
    data: rawData,
    async:false,
    dataType: "json",
    type:"POST",
    success:function(data)
    {
        alert('asd');
        result.data = data;
        alert(data);
    },
    error:function(lol){
        alert('omggg !!!!'+lol);
    }

});

编辑:添加 javascript 代码示例

【问题讨论】:

  • 你需要支持的浏览器是否支持跨域header?
  • 您是否仅尝试使用Access-Control-Allow-Origin 并将其设置为*?这一直对我有用。
  • 好吧,我刚刚发现一篇文章解释了这些标题的作用。对于测试,我使用的是 firefox,实际上我得到了返回正文(thx httpfox),但我无法获得名为(jQuery.ajax)的成功方法

标签: jquery http-post cross-domain-policy


【解决方案1】:

有时候有点乱,一些想法:

  • CORS 仅受相当现代的浏览器支持,因此您需要确保使用其中一种。
  • IE 仅通过 XDomainRequest 对象支持 CORS,而不是标准的 XMLHttpRequest 对象,但 jQuery 并没有专门满足这一点(然而;我不得不承认我有点惊讶,预计它会太长了),所以你必须添加特殊处理才能使其在 IE 上工作(然后只有 IE8 及更高版本)。 编辑:令人震惊的是,jQuery 团队显然已经收到了该请求并拒绝ticket #8283 这使得 没有感觉。
  • 您确定Access-Control-Allow-Origin 的值吗? 看起来它只允许从它所在的服务器进行访问。该标头旨在指定服务器将允许请求来自的来源。 (并且* 是允许的,意思是“任何地方”。)
  • 我似乎从我对 Firefox 的实验中回忆起,在响应它没有请求的 OPTIONS 请求时,我的允许方法很挑剔。
  • 仔细检查您是否允许所有请求发送的标头;在您的示例中,您似乎只允许一个标头 (x-requested-with),但我敢打赌,实际请求中还会有其他标头。

FWIW(我不是 Python 人),这是我的 JSP 代码,它可以工作,也许它会很有用——我认为对象名称足够清晰,即使你不使用 Java 也可以阅读(谁知道呢? ,也许你会这样做):

String corsOrigin, corsMethod, corsHeaders;

// Find out what the request is asking for
corsOrigin = request.getHeader("Origin");
corsMethod = request.getHeader("Access-Control-Request-Method");
corsHeaders = request.getHeader("Access-Control-Request-Headers");
if (corsOrigin == null || corsOrigin.equals("null")) {
    // Requests from a `file://` path seem to come through without an
    // origin or with "null" (literally) as the origin.
    // In my case, for testing, I wanted to allow those and so I output
    // "*", but you may want to go another way.
    corsOrigin = "*";
}

// Add headers allowing specifically what was requested
response.addHeader("Access-Control-Allow-Origin", corsOrigin);
response.addHeader("Access-Control-Allow-Methods", corsMethod);
response.addHeader("Access-Control-Allow-Headers", corsHeaders);
if (request.getMethod().equals("OPTIONS"))
{
    // Done, no body in response to OPTIONS
    return;
}
// Processing the GET or POST here; output the body of the response

请注意,我对 GETPOSTOPTIONS 使用完全相同的逻辑,除了在 OPTIONS 的情况下,我不输出响应正文。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 2011-06-30
    • 2013-01-05
    • 2010-12-07
    • 2014-09-01
    • 1970-01-01
    相关资源
    最近更新 更多