我计划开发一个Chrome应用项目,在此过程中需要执行大量的AJAX调用。在确定选择Chrome应用作为平台之前,我想更好地了解它与Web应用程序相比在AJAX调用方面的限制和优势。通过一些研究,我得出了以下答案。由于我在这个领域的经验有限,我想知道我的发现是否正确,以及是否还有其他应考虑的限制。
解决这个问题的方法是跨域权限: 如果授予了访问服务器的权限,即使没有收到适当的ACAO头,请求也会被放行。但是也可以仅依赖CORS: 如果未授予跨域权限,但请求是发往使用通配符ACAO设置的服务器的,也会被放行。) 另外需要注意两件事:
1. 来源
限制方面,对于Chrome应用程序而言,与Web应用程序相比更加灵活:与AJAX请求相关的同源策略可以通过在应用程序清单中请求跨域权限来放宽。因此,不需要使用跨域资源共享(CORS)和JSONP等技术(实际上这些技术被内容安全策略(CSP)禁止)。在可访问内容方面的限制更为严格:Chrome应用程序只能引用应用程序内的脚本、样式表、图像、框架、插件和字体,但媒体资源(视频、音频和相关文本轨道)可以从任何外部资源加载。‘connect-src’指令被设置为允许加载任何URI,因此在跨源权限或使用CORS的情况下,可以向所有主机发出AJAX调用并接收文本和媒体类型响应。其他内容类型可以作为blob提供。CSP不能放宽。
(我发现的一个特殊情况:正如所述,CSP禁止加载多种内容类型,因此必须通过AJAX请求将它们作为blob进行加载。由于同源策略的影响,这必须通过CORS来完成。大多数服务器即使其内容是公开的,也没有启用CORS。因此,如果Chrome应用程序始终强制执行“Access-Control-Allow-Origin”(ACAO)响应头,则在许多情况下CORS方法将失败。解决这个问题的方法是跨域权限: 如果授予了访问服务器的权限,即使没有收到适当的ACAO头,请求也会被放行。但是也可以仅依赖CORS: 如果未授予跨域权限,但请求是发往使用通配符ACAO设置的服务器的,也会被放行。) 另外需要注意两件事:
- Chrome应用程序的一些文档引用的是扩展而不是应用程序。在这些情况下,我假设提供的信息对于应用程序也是正确的。
- 同步XHR请求被禁用了。