JavaScript 可以通过 JSONP 远程访问哪些资源?
What resources can remote JavaScript access via JSONP?
JSONP据说"by-pass"同源策略。我认为这意味着使用它允许脚本从不同域上的远程服务器加载,并 运行 在网站本地加载。
不过我不清楚脚本在 运行ning 期间究竟能做什么。
是否与从同一域加载的 JavaScript 一样享有特权?是否对 JSONP 施加了任何可以指望的额外限制?
JSONP 通过使用普通的 <script>
标签和通过 HTTP GET 作为 JavaScript 获取的内容来工作。浏览器基本上认为它只是获取页面使用的另一个脚本,因此第三方站点响应的代码可以做任何它想做的事情。
"Well-behaved" JSONP 源按照惯例发回对函数的调用,该函数的名称作为 URL 中的 "callback" 参数给出。即服务器响应JavaScript语句:
yourCallback({ name: value, ... });
但是,您页面上的代码确实无法判断这是否真的发生了。
在浏览器中,<script>
标签可以引用位于任何域中的脚本。脚本资源不受 Ajax 请求的同源限制。
因此,您可以动态插入一个脚本标签,该标签将引用任何域上的脚本,并且它将成功加载并且不会被同源限制阻止。
这就是 JSONP 的工作原理 - 通过请求加载远程脚本和 运行 来发出跨源请求。它不是完全绕过同源限制,因为您不能直接使用 JSONP 进行远程 API 调用,因为您正在联系的服务器必须明确支持 JSONP,因为它是一种完全不同的响应类型。因此,从本质上讲,您正在联系的服务器必须明确支持并允许通过 JSONP 的跨源请求。
I'm not clear however on what exactly can be done by the script while
it is running.
一旦您请求了 JSONP 脚本,该脚本就只是您页面中 Javascript 运行ning 的一部分。它确实可以做您页面中任何脚本 运行ning 可以做的任何事情。
Is it just as privileged at JavaScript loaded from the same domain?
Are there any additional restrictions imposed on JSONP that one can
count on?
这只是您网页中 运行 的一个脚本。它可以做您页面中任何脚本 运行ning 可以做的任何事情。按照惯例,它应该调用在 URL 中指定的回调函数并向其传递一些数据(请求的结果),但它可以在您的页面中执行任何其他 Javascript可以做。
JSONP 脚本没有额外的限制。浏览器不知道脚本是否为 JSONP 脚本。它只是一个脚本,可以执行与任何其他脚本完全相同的操作。
JSONP 基本上是在浏览器支持 CORS 之前解决问题的 hack。如果可以使用 CORS,这些天我想不出任何理由再设计基于 JSONP 的解决方案。 CORS 更安全,因为它不会让其他网站 运行 在您的页面上下文中随机 Javascript。
JSONP据说"by-pass"同源策略。我认为这意味着使用它允许脚本从不同域上的远程服务器加载,并 运行 在网站本地加载。
不过我不清楚脚本在 运行ning 期间究竟能做什么。
是否与从同一域加载的 JavaScript 一样享有特权?是否对 JSONP 施加了任何可以指望的额外限制?
JSONP 通过使用普通的 <script>
标签和通过 HTTP GET 作为 JavaScript 获取的内容来工作。浏览器基本上认为它只是获取页面使用的另一个脚本,因此第三方站点响应的代码可以做任何它想做的事情。
"Well-behaved" JSONP 源按照惯例发回对函数的调用,该函数的名称作为 URL 中的 "callback" 参数给出。即服务器响应JavaScript语句:
yourCallback({ name: value, ... });
但是,您页面上的代码确实无法判断这是否真的发生了。
在浏览器中,<script>
标签可以引用位于任何域中的脚本。脚本资源不受 Ajax 请求的同源限制。
因此,您可以动态插入一个脚本标签,该标签将引用任何域上的脚本,并且它将成功加载并且不会被同源限制阻止。
这就是 JSONP 的工作原理 - 通过请求加载远程脚本和 运行 来发出跨源请求。它不是完全绕过同源限制,因为您不能直接使用 JSONP 进行远程 API 调用,因为您正在联系的服务器必须明确支持 JSONP,因为它是一种完全不同的响应类型。因此,从本质上讲,您正在联系的服务器必须明确支持并允许通过 JSONP 的跨源请求。
I'm not clear however on what exactly can be done by the script while it is running.
一旦您请求了 JSONP 脚本,该脚本就只是您页面中 Javascript 运行ning 的一部分。它确实可以做您页面中任何脚本 运行ning 可以做的任何事情。
Is it just as privileged at JavaScript loaded from the same domain? Are there any additional restrictions imposed on JSONP that one can count on?
这只是您网页中 运行 的一个脚本。它可以做您页面中任何脚本 运行ning 可以做的任何事情。按照惯例,它应该调用在 URL 中指定的回调函数并向其传递一些数据(请求的结果),但它可以在您的页面中执行任何其他 Javascript可以做。
JSONP 脚本没有额外的限制。浏览器不知道脚本是否为 JSONP 脚本。它只是一个脚本,可以执行与任何其他脚本完全相同的操作。
JSONP 基本上是在浏览器支持 CORS 之前解决问题的 hack。如果可以使用 CORS,这些天我想不出任何理由再设计基于 JSONP 的解决方案。 CORS 更安全,因为它不会让其他网站 运行 在您的页面上下文中随机 Javascript。