小编典典

使用跨域资源共享的跨域POST查询不会获取任何数据

ajax

我正在通过POST请求跨域发送数据,但是响应不起作用,特别是,从未调用过jQuery的成功处理程序。

正在使用的资料:Django,Apache,jQuery。

因此,我建立了一个与此类似的请求:

$.ajax({
    url: "http://somesite.com/someplace",
    type: "POST",
    cache: false,
    dataType: "json",
    data: { ... },
    success: function( msg ) {
        alert(msg);
    },
});

如您所知,CORS允许我OPTIONS适当地回答一个查询,说“是的,您可以向我发布邮件”。我在做什么
Firebug确认我正在获取200状态代码,并且返回类型实际上是application/json。但是,Firebug还确认 没有
调用上述成功处理程序。

供参考,我的答复OPTIONS是:

elif request.method == "OPTIONS":
    response = HttpResponse("")
    response['Access-Control-Allow-Origin'] = "*"
    response['Access-Control-Allow-Methods'] = "POST, GET, OPTIONS"
    response['Access-Control-Allow-Headers'] = "X-Requested-With"
    return response

相反,如果我设置一个complete: function()...处理程序,它将起作用。

因此,问题是:正在发生(或没有发生),为什么?我得到的数据很好,我只想能够返回响应。


更新这解决了我在一些浏览器上的问题,但是由于我对这种行为没有完整的明确的解释,所以我将它保持开放

好的,所以我阅读了手册,并且据我所知,所应用的算法大致如下:

  1. 用户代理可以实施预检呼叫。这是OPTIONS要求。其思想是,他们发出此请求,从而为他们提供有关所请求资源的答案,然后应将其缓存。 我没有回传一个max-age 字段,所以我怀疑在返回成功并允许X请求的同时,用户代理的缓存中没有允许我执行的操作,因此默认规则(隔离请求) )。
  2. 当您发出实际请求时,我相信用户代理应该检查飞行前缓存中的权限。如果没有我的max-age字段,我认为找不到这些权限。但是,使用相同的标题进行响应POST似乎允许Firefox和Google Chrome查看响应。歌剧不能。IE目前仍未经测试。

我目前尚不了解,并且从手册中(至少对我而言)不清楚,CORS请求是否还应在请求中使用这些标头以及OPTIONS。我将试验Max- Age标题,看看允许或不允许的内容。但是,我仍然对此问题缺乏明确的权威性理解,因此,如果有人在这里知道,我会很高兴。


阅读 208

收藏
2020-07-26

共1个答案

小编典典

好的,所以我相信正确的做法是这样的:

if request.method == "POST":
    response = HttpResponse(simplejson.dumps(data),mimetype='application/json')
    response['Access-Control-Allow-Origin'] = "*"
    return response
elif request.method == "OPTIONS":
    response = HttpResponse("")
    response['Access-Control-Allow-Origin'] = "*"
    response['Access-Control-Allow-Methods'] = "POST, OPTIONS"
    response['Access-Control-Allow-Headers'] = "X-Requested-With"
    response['Access-Control-Max-Age'] = "1800"
else:
    return HttpResponseBadRequest()

这是基于根据预检请求从Mozilla挖掘而来文档

所以,我相信会发生的是:

  1. 如果预检缓存中没有任何内容,则将OPTIONSX-Requested-With设置为发送,XMLHttpRequest我相信这是必要的,以允许Javascript和Origin标头访问任何内容。
  2. 服务器可以检查该信息。 这就是CORS的安全性 。就我而言,我的回答是“任何来源都可以”和“允许您发送X-Requested-With东西”。我是说OPTIONS并且POST被允许,并且此响应应该被缓存30分钟。
  3. 然后,客户端继续进行先前的POST。
  4. 我最初将响应修改为包括Allow-MethodsAllow-Headers但是根据上面链接的文档中的交流,这不是必需的。这很有意义,访问检查已经完成。
  5. 我相信那会发生什么是这里描述资源共享检查。基本上,一旦提出要求,浏览器就会再次检查该Allow-Origin字段的有效性,例如POST。如果通过,则客户端可以访问数据,否则,请求已经完成,但浏览器拒绝实际的客户端应用程序(Javascript)访问该数据。

我认为这是对正在发生的事情的正确总结,无论如何它似乎都起作用。如果我不对,请大喊。

2020-07-26