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 并没有专门满足这一点(然而;我不得不承认我有点惊讶,预计它会太长了),所以你必须添加特殊处理才能使其在 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 的情况下,我不输出响应正文。

【讨论】:

以上是关于jQuery 和跨域 POST 请求的主要内容,如果未能解决你的问题,请参考以下文章

浅谈jquery中的ajax请求和跨域请求

AngularJS 和跨域 POST

React中的ajax请求和跨域问题

SignalR 核心和跨域请求的问题

AngularJS和跨域请求被阻止[关闭]

一篇搞定vue请求和跨域