7

我正在开发一个 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 代码示例

4

1 回答 1

9

有时有点麻烦,一些想法:

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

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

于 2011-05-06T07:44:54.680 回答