jQuery和跨域POST请求

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

有时候这有点小提琴,有些想法:

  • CORS仅支持相当现代的浏览器,因此您需要确保使用其中一种。
  • IE仅通过XDomainRequest对象支持CORS,而不是标准的XMLHttpRequest对象,但是jQuery并没有特别满足(但是我不得不承认我有点惊讶并期望它会在太久之前 ),所以你必须添加特殊处理使这个工作在IE(然后只有IE8及以上)。 编辑 :令人震惊的是,显然jQuery团队已经有了这个请求并拒绝了它: 票#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的情况下,我没有输出响应体。