在复习跨域的时候,复习到了JSONP跨域,大家都知道JSONP跨域是通过动态创建script标签,然后通过其src属性进行跨域请求的,前端需要一个数据处理的回调函数,而服务端需要配合执行回调函数,放入要传过来的数据

这时候问题来了,JSONP跨域的script标签请求为什么不受同源策略的限制?

这个问题可以这么回答:

首先我们要理解什么时候同源策略,它的作用是什么,它干了什么事。

要理解同源策略得先知道:什么是同源?

同源即 协议,域名,端口号三个完全一致,才能称作同源

当你打开一个网站时,这个网站开始执行脚本,会检测这个脚本的来源,如果这个脚本的来源与当前网站不同源的话,就会限制其执行,即受到同源策略的限制

这里直接复制MDN对同源策略的概念解释

同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。

其中MDN谈到了很重要的一点,IE浏览器的同源是不包含端口号的,即端口号不一致也是属于同源

通俗易懂的说同源策略:不允许A的文档或脚本与B的文档脚本瞎搞在一起,两个相互独立开来,不能直接相互访问

下面进入正题:

要理解JSONP跨域的script标签请求为什么不受同源策略的限制这个问题的重点就在于:要执行的脚本是如何判断他的来源的

可以这么理解,脚本的来源取决于脚本所嵌入的资源的来源,比如说访问A主机的当前HTML文件中有一个script标签,这个script标签的src属性请求了一个js脚本,因为这个脚本是由A主机的HTML文件的嵌入的script标签发起请求获取的,因此这个脚本的来源是属于A主机的。

到了这里,问题的答案也就出来了,jsonp的script标签请求回来的资源与当前域是相同的域,因此不受同源策略的影响

对于同源策略这里还有一个很关键的点:同源策略并非应用于不同源的窗口中的所有对象的所有属性

它只应用到了其中的大多数属性,尤其是对Document对象的几乎所有属性而言。

凡是包含另一个服务器中文档的窗口或窗体,都是同源策略适用的范围。

如果脚本打开一个窗口,脚本也可以关闭它,但不能以任何方式查看窗口内部。

同源策略还应用于使用XMLHttpRequest生成的HTTP请求。(这也就是为什么我们常用的Ajax请求会受到同源策略影响的原因了)这个对象允许客户端JavaScript生成任意的HTTP请求到脚本所属文档的Web服务器,但是不允许脚本和其他Web服务器通信。

参考资料:MDN同源策略 https://developer.mozilla.org/zh-CN/docs/Web/Security/Same-origin_policy

深入理解同源策略:https://blog.csdn.net/gtLBTNq9mr3/article/details/78455211

JSONP跨域的script标签请求为什么不受同源策略的限制?的更多相关文章

  1. js原生跨域--用script标签实现

    刚刚从培训班学习完,总想写一下东西,自从进入了这个院子,每次出现问题,总是能找到一些答案,给我一些帮助. 作为新手,就写一下简单的吧,院子里面有很多大牛, 说句实话,他们的很多代码我都看不懂. 我就写 ...

  2. Jsonp跨域访问

    很早之前看过好几篇跨域访问的文章,然后做项目的时候基本没有遇到跨域访问的问题.不过该来的还是会来,前些天终于让我遇到了.于是重温了一下原理这些,再进行实战.于是现在也敢通过实战后的一些理解来和大家分享 ...

  3. 原生JS封装Ajax插件(同域&&jsonp跨域)

    抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢? 最近都在做原生JS熟悉的练习... 用原生Js封装了一个Ajax插件,引入一般的项目,传传数据,感觉还是可行的...简单说说思路,如有不正 ...

  4. 我的jsonp跨域问题

    关于jsonp跨域问题,在这个方面也是了解一点点,先记录下来,主要作为以后查看,之前下载并安装过wampserver,了解到了jsonp和json的区别,现在谈谈跨域这个问题: 首先什么是跨域,简单地 ...

  5. 深入剖析jsonp跨域原理

    在项目中遇到一个jsonp跨域的问题,于是仔细的研究了一番jsonp跨域的原理.搞明白了一些以前不是很懂的地方,比如: 1)jsonp跨域只能是get请求,而不能是post请求: 2)jsonp跨域的 ...

  6. JSONP ---------跨域

    什么是跨域 JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象.但在安全限制的同时也给注入iframe或是ajax应用上带来了不少麻烦.这里把涉及到跨域的一些问题简单地整理一下: 首 ...

  7. JSONP跨域访问百度实现搜索提示小案例

    一.JSONP简介 JSONP 全称 JSON with padding(填充式 JSON 或参数式 JSON),JSONP实现跨域请求的原理,就是动态创建<script>标签,然后利用& ...

  8. JSONP跨域和CORS跨域的区别

    跨域: 由于浏览器中的javascript的同源策略,同源策略会阻止一个域的JavaScript脚本和另一个域的内容进行交互. 同源:协议,域名,端口,三者有一个不同即为跨域. 解决跨域有以下多种方法 ...

  9. JSONP跨域和CORS跨域

    什么是跨域? 跨域:指的是浏览器不能执行其它网站的脚本,它是由浏览器的同源策略造成的,是浏览器的安全限制! 同源策略 同源策略:域名.协议.端口均相同. 浏览器执行JavaScript脚本时,会检查这 ...

随机推荐

  1. win7 开机网络等待,应用打不开的解决方案

    状况描述:最近,笔记本电脑开机之后,网络图标一直转圈,任何应用程序也打不开,开机关机还是可以的,之前是偶尔发生这种情况,然后重启一下或许就行了,但最近每次开机都是这个情况,很恼火,在网上百度了很久,有 ...

  2. 第15个算法-实现 Trie (前缀树)(LeetCode)

    解法代码来源 :https://blog.csdn.net/whdAlive/article/details/81084793 算法来源:力扣(LeetCode)链接:https://leetcode ...

  3. mybatis01-1测试

    首先需要数据源信息和日志文件 然后一个SQLMapConfig.xml配置文件连接数据库并且映射后一个xml文件,另一个xml文件写入SQL语句, 最后text测试文件读取第一个配置文件,放到SQLS ...

  4. 【Intellij】导出 jar 包

    需要在 Intellij 导出 jar 包,一时不知道该怎么做,后来总算找到了方法,步骤如下: 1. File → Project Structure... → Artifacts → + → jar ...

  5. PHP验证身份证格式

    互联网公司对身份证验证的需求越来越多,然而普通的小公司是无法对接公安部门的身份认证系统的.几乎都是在网上买一些大的互联网公司的一些认证服务.即使是便宜一些的认证价格也达到了10万次/万元.也就是一角钱 ...

  6. setInterval循环设置并传入不同的参数

    var taskId; var __sto = setInterval; window.setInterval = function(callback,timeout,param){ var args ...

  7. kubernetes CRD开发指南

    扩展kubernetes两个最常用最需要掌握的东西:自定义资源CRD 和 adminsion webhook, 本文教你如何十分钟掌握CRD开发. kubernetes允许用户自定义自己的资源对象,就 ...

  8. L4170[CQOI2007]涂色

    #include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i = a; i <= b; ...

  9. Python学习系列(四)Python 入门语法规则2

    Python学习系列(四)Python 入门语法规则2 2017-4-3 09:18:04 编码和解码 Unicode.gbk,utf8之间的关系 2.对于py2.7, 如果utf8>gbk, ...

  10. 消息中间件-activemq实战整合Spring之Topic模式(五)

    这一节我们看一下Topic模式下的消息发布是如何处理的. applicationContext-ActiveMQ.xml配置: <?xml version="1.0" enc ...