js和jquery使用jsonp解决跨域,吊打面试官系列

URL由协议、域名、端口和路径组成,如果两个URL的协议、域名和端口相同,则表示他们同源。

由于同源策略,而且随着互联网的发展,“同源策略”越来越严格。目前,如果非同源,共有三种行为收到限制。

  • Cookie、LocalStorage 和 IndexDB 无法读取

  • DOM 无法获得

  • Ajax 请求不能发送

同源政策规定,AJAX 请求只能发给同源的网址,否则就报错。

除了架设服务器代理(浏览器请求同源服务器,再由后者请求外部服务),有三种方法规避这个限制。

  • JSONP

  • WebSocket

  • CORS


文本将介绍分别 js 和 jquery 来使用 jsonp。

后面所有的例子都是运行在服务器环境下的。


好的,用一个简单的例子来引入问题,先看下面的demo:

Document

这是我们开篇用的那个例子,在服务器环境下,能够正常运行,页面会有显示,也就是说我们成功的加载了来自于百度静态资源公共库中的 jquery

对的,我们跨域了吗?我们跨域了吗?

在这个例子中,其实我们已经跨域了,因为

<script src="http://apps.bdimg.com/libs/jquery/1.10.2/jquery.js"></script>

这个 jquery 来自于百度静态资源公开库,百度的这个域名肯定与我们本地的不同,但是我们却成功的加载了这段 jquery 代码到我们的页面上。这是为什么呢?

浏览器会进行同源检查(看清楚,这里是浏览器会进行同源检测。),这导致了跨域问题,然而这个跨域检查还有一个例外那就是 HTML 的 <script> 标记;我们经常使用 <script> 的 src 属性,脚本静态资源放在独立域名下或者来自其它站点的时候这里是一个 url;这个 url 响应的结果可以有很多种,比如 JSON,返回的 json 值成为 <Script> 标签的 src 属性值.这种属性值变化并不会引起页面的影响。 按照惯例,浏览器在 url 的查询字符串中提供一个参数,这个参数将作为结果的前缀一起返回到浏览器;

Web页面上调用 js 文件时则不受是否跨域的影响(不仅如此,我们还发现凡是拥有“src”这个属性的标签都拥有跨域的能力,比如 <script><img><iframe>

在浏览器中,<script<img><iframe><link> 等标签都可以加载跨域资源,但浏览器限制了 JavaScript 的权限使其不能读、写加载的内容。

另外同源策略只对网页的 HTML 文档做了限制,对加载的其他静态资源如 javascript 、 css、图片等仍然认为属于同源。

这就是为什么我们可以使用 <script src="http://apps.bdimg.com/libs/jquery/1.10.2/jquery.js"></script> 来加载跨域的资源的原因。


OK,下面我们来看一个 没跨域的情况下 使用 jquery 发出请求加载数据的例子:

后台代码(result.php):

<?php if($_GET) { $str = '{"id":"get"}'; echo $str; } if($_POST){ $str = '{"id":"post"}'; echo $str; } ?>

我们在 demo.html 中使用 jquery 分别使用 GET 和 POST 方式 向 result.php 发出请求:

demo.html

Document

jq-get


jq-post


后台返回的数据如下:

demo.html 与 result.php 均在 8082 端口下,不存在跨域的情况,

运行效果图如下:

可见,在没有跨域的情况下,是很好用的。

下面,我们将 demo.html 移到本机的另一个端口(port: 3000)下,那么 demo.html 与 result.php 就存在了跨域的情况:

使用 jsonp 来解决这个问题

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

前端CSS面试题文档,JavaScript面试题文档,Vue面试题文档,大厂面试题文档,需要的读者可以戳这里免费领取!

觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)**

最后

前端CSS面试题文档,JavaScript面试题文档,Vue面试题文档,大厂面试题文档,需要的读者可以戳这里免费领取!

[外链图片转存中…(img-fELgYjmH-1712165469749)]

[外链图片转存中…(img-6Hzm9MIx-1712165469749)]

  • 19
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值