我正在做一个需要跨域请求的项目,但似乎没有任何方法可以在纯网页中允许这样做。
Chrome 扩展程序可以简单地请求他们想要向其发出请求的域的权限,如下例所示。
"permissions": [
"http://www.google.com/",
"https://www.google.com/"
]
http://developer.chrome.com/extensions/xhr.html
我发现https://developers.google.com/chrome/apps/docs/no_crx似乎更接近我正在寻找的东西,但唯一允许的权限是“地理位置”、“通知”和“无限存储”。
可以在我想向其发出请求的域上设置 HTTP 标头 Access-Control-Allow-Origin,但它们不受我的控制,因此不实用。
同样的 Content-Security-Policy: connect-src https://www.google.com;主要用于进一步限制访问而不是开放访问。
http://www.html5rocks.com/en/tutorials/security/content-security-policy/
我理解安全问题,但快速搜索会显示人们通过制作代理服务器来解决这个问题。允许发出等效请求是否有意义,这意味着没有用户会话/cookie 信息的请求(如隐身模式)?或者页面可以以与扩展相同的方式请求许可的某种机制?似乎有点倒退,要求这样的事情以浏览器特定的方式关闭。
就像 webspeech api(或 getUserMedia)请求访问使用麦克风一样。
有什么想法或者我错过了什么吗?
编辑:我在别处发布了这个并得到:
如果您从受您控制的域发出请求,则可以使用其他选项(如 JSONP)来访问来自另一个域的数据。或者,您可以加载 iframe 并使用 postMessage() 与内容交互 - 有许多工具也强制您尝试与之通信的域愿意共享该数据。
我:
JSONP 看起来像是提供 JSON 的数据源的解决方案,但我不确定这是否能解决我的整体问题。我正在尝试创建一个工具,该工具将从各种来源中提取数据,以显示结果和解释信息以执行操作。一个查询可能是 jsonp 或其他官方方法应该允许的 google 搜索,但这不适用于从其他网页抓取数据。所有发出的请求都不需要用户会话信息,因此代理可以工作,但会增加延迟和维护成本。
postMessage() 接口需要被请求的页面来实现监听器,对吗?
到目前为止,“最佳”解决方案似乎仍然是拥有一个在特权环境中运行的伴随扩展,它可以发出请求并与页面交流结果。该工具可以在网页中执行各种其他工作,因此我宁愿将主要环境保留为网页,并选择运行扩展程序。