jQuery和跨域POST请求

时间:2011-05-06 07:34:24

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

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

1 个答案:

答案 0 :(得分:9)

有时候这是一个小提琴,有些想法:

  • 只有相当现代的浏览器支持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的情况下,我不输出响应正文。< / p>