【问题标题】:Cross-domain requests with jQuery (working in Python)使用 jQuery 的跨域请求(在 Python 中工作)
【发布时间】:2012-11-30 23:54:52
【问题描述】:

这段 Python 代码运行良好

print 'foo'
params = {'memberId': '1'}
data = urllib.urlencode(params)
url = 'http://aaa.bbb.com/ccc/'
req = urllib2.Request(url, data, {'Content-Type': 'application/json'})
f = urllib2.urlopen(req)
response = f.read()

print '===>', response

response = eval(response.decode('unicode-escape'))   
f.close()

我想知道对应的javascript代码是什么?我试过这个,警告“错误”。目前我在 ddd.bbb.com。 Web 服务位于 aaa.bbb.com。我无法为此设置相对路径。

请告知如何配置跨域。谢谢。

jQuery.ajax({
                        url: 'http://aaa.bbb.com/ccc',
                        type: 'GET',
                        contentType: "application/json",
                        dataType: "json",
                        data: {'memberId':'1'},
                        success: function (data) {
                            alert("ok");
                        },
                        error: function () {
                            alert("error");
                        }
                    });

【问题讨论】:

  • 设置相对于脚本路径的url,而不是域的完整位置。
  • 您正在浏览器中运行后者。同源策略是一种浏览器端保护(考虑到没有任何跨域配置,我认为很可能是这种情况)
  • 您的内容类型是 json,但您没有发送 json。
  • @musa - 你发送什么并不重要,因为无论如何它都会转换为查询字符串,重要的是你收到什么。正如 Alexander 所说,跨浏览器通常不支持常规 JSON 请求(没有 CORS 等),并且与 Python 相比根本不相关。
  • 添加到@Alexander 的评论中:developer.mozilla.org/en-US/docs/…

标签: javascript jquery python ajax json


【解决方案1】:

关于 Javascript 的“同源策略”以及如何解决它,大约有 1 万亿(这是我的技术估计值 ;-) )其他 Stack Overflow 问题。我强烈建议您检查一下。

作为一个快速总结,您的基本选择是:

  1. 使用 JSONP(仅当 aaa.bbb.com 支持 JSONP 时才有效)
  2. 让 aaa.bbb.com 将 ddd.bbb.com 添加到它的“安全列表”中(有一个更好的术语,但我忘记了);如果您控制 aaa.bbb.com,这可能是您最好的选择
  3. 如果以上任何一项都做不到,请设置一个代理服务(仅 Apache 可以处理)将 ddd.bbb.com/someUrl 转发到 aaa.bbb.com,以便浏览器认为您正在点击您自己的域,但实际上内容来自其他地方。

为了让您了解核心问题,其要点是浏览器不允许 evildomain.com 中的代码访问 yourbank.com,作为安全预防措施。但是,浏览器将允许您从 yourbank.com 检索脚本,无论您的来源是什么,因此您可以使用称为 JSONP 的东西来利用它……但是要使 JSONP 工作,yourbank.com 的所有者必须支持它(他们必须为您量身定制他们的脚本)。

如果 yourbank.com 明确表示“如果 evildomain.com 与我们混淆,那就太酷了”,浏览器也会让您访问 yourbank.com。他们通过将一个特殊文件放在他们网站上的一个特殊位置来做到这一点(我忘记了细节,但它们很容易查找)。

如果你不能做到这两个,你可以让你的 evildomain.com 服务器为你访问 yourbank.com。服务器不受与浏览器相同的限制,因此它们可以访问任何他们想要的站点。当它这样做时,它可以将它在那里找到的内容发回给你,这就是所谓的“代理”(通过 evildomain.com 到 yourbank.com,这是代理的结束)。

希望这能澄清一点。

【讨论】:

  • 是的,你是对的。我搜索了很多结果,尝试了一些但没有一个有效。请发布您认为可以解决此问题的一种可能的解决方案(或链接)?
  • stackoverflow.com/questions/3076414/… 是我能找到的评分最高的。
  • 我还改进了我的“快速总结”,让您对您的选择有一个基本的概述。
  • 最后一点:你上面的python代码本质上是一个代理;如果您要在您的网站上提供该脚本(例如ddd.bbb.com/proxyToAAA),那么您可以在不违反浏览器规则的情况下访问 aaa 的内容(因为就浏览器所见,您不是从 aaa 获得的,您'从 ddd 获取)。
猜你喜欢
  • 2011-11-30
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
  • 2014-09-01
  • 1970-01-01
  • 2011-12-24
  • 2013-02-24
  • 1970-01-01
相关资源
最近更新 更多