当前位置: 首页 > 面试题库 >

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

宁侯林
2023-03-14
问题内容

我正在通过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()...处理html" target="_blank">程序,它将起作用。

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

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

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

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

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


问题答案:

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

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)访问该数据。

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



 类似资料:
  • 问题内容: 我正在编写一个HTML5应用程序,该应用程序使用JSONP从几个不同的来源收集数据。我对GET所做的任何事情都可以正常工作。我现在正尝试发布数据,并且遇到了一个有趣的问题。我需要将数据从我的应用程序发布到另一个应用程序,该应用程序从本地计算机运行。我正在尝试编写具有跨平台功能的移动应用程序(请考虑使用Pulse / Flipboard),因此该代码将始终从本地源运行。我的思考过程如下:

  • 跨域资源共享 (CORS) 跨域资源共享(Cross-Origin Resource Sharing)允许WEB端的应用程序访问不属于本域的资源 配置格式 CORS配置为json字符串,类似 { "rules":[ { "id":"id1" "AllowOrigin":"http://*.example.com" //指定允许发送跨源请求的源,支持使用通配符

  • 问题内容: 我对跨域JavaScript的概念有疑问。 有一个服务器(ex amazon.com),在其中只有选定的域可以使用其Web服务。所以可以肯定,如果我尝试从本地使用他们的服务,我将无法。我在控制台上得到了这个 跨域请求被阻止:“同源起源”策略禁止读取http://football20.myfantasyleague.com/2014/export?TYPE=rosters&L=52761

  • 我有两个ruby on rails应用程序,分别位于两个不同的域上(例如和)

  • 本文向大家介绍js跨域资源共享 基础篇,包括了js跨域资源共享 基础篇的使用技巧和注意事项,需要的朋友参考一下 本文详细介绍了javascript跨域资源共享,供大家参考,具体内容如下 1.为什么提出跨域资源共享(CORS)?     因为XHR实现ajax的安全限制是:XHR 对象只能访问与包含它的页面位于同一个域中的资源 2.如何实现跨域?(跨浏览器) 以上就是本文的全部内容,希望对大家的学习

  • 我目前正在从事一个托管在域上的laravel项目。此应用程序的一部分(某些功能)必须位于不同的域上。我在我的网上找到了一条路。在php中,我用以下命令映射了所有路由: 以及需要以相同方式位于另一个域上,但具有不同域的路由。好啊在主域中,我创建了一个具有src属性的图像: 指向此方法路线: 它起作用了。我在不同的域上共享同一个会话,但是,我想问你们,对于这个案例场景,你们是否知道更好的方法。我知道这