jQuery 和跨域 POST 请求
Posted
技术标签:
【中文标题】jQuery 和跨域 POST 请求【英文标题】:jQuery and Cross Domain POST Requests 【发布时间】: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)的成功方法
【参考方案1】:
有时候有点乱,一些想法:
CORS 仅受相当现代的浏览器支持,因此您需要确保使用其中一种。 IE 仅通过XDomainRequest
对象支持 CORS,而不是标准的 XMLHttpRequest
对象,但 jQuery 并没有专门满足这一点(然而;我不得不承认我有点惊讶,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
请注意,我对 GET
、POST
和 OPTIONS
使用完全相同的逻辑,除了在 OPTIONS 的情况下,我不输出响应正文。
【讨论】:
以上是关于jQuery 和跨域 POST 请求的主要内容,如果未能解决你的问题,请参考以下文章