如果 JSONP 可以轻松解决跨域约束(同源策略),为什么浏览器还要麻烦呢?我绞尽脑汁是有原因的,但我想出的只是它实际上更糟,并提供了一种安全的错觉。
2 回答
原因很简单,它基于TRUST。如果没有信任,就不能做 JSONP。例如:如果域abc.com
不信任def.com
,abc.com
则不支持 JSONP 并且def.com
无法使用 JSONP(或 CORS)。
服务器和客户端都必须相互信任才能使 JSONP 工作(包括 CORS)
- 服务器信任客户端并支持 JSONP (CORS)
- 客户端信任从服务器返回的脚本不会破坏页面上的 javascript的服务器。因为为了使用 JSONP,客户端加载脚本并使用 script 标签执行它 => 非常危险。
当您实现代码时,通常两个域都在您的控制之下,这样做并没有什么坏处。在其他情况下,例如yourdomain.com
彼此evil.com
不信任 => 浏览器阻止跨域请求以确保安全。
JSONP 可以轻松解决跨域约束
不,您不能总是使用 JSONP。JSONP 仅在浏览器和服务器之间存在信任时才有效。
JSONP不能解决跨域约束。一点也不。
忘记术语 JSONP。它只是一个<script>
元素,通常但不一定动态插入到 DOM 中。不多也不少。
总是可以从任何域加载<script>
元素。<script>
元素没有跨域限制。
这就是 JSONP 的全部内容。这只是使用<script>
元素的约定。它与任何其他跨域约束都没有任何关系,因为它不使用受这些约束的机制。
请注意,您不能只决定使用 JSONP 跨域访问 JSON 资源。如果资源是纯 JSON,除非它在同一个域中或允许通过 CORS 访问,否则您将无法读取它。您无法从浏览器中更改此设置。服务器必须以可执行脚本的形式提供资源,即 JSONP。