什么是跨域?什么情况下会发生跨域请求?
跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器施加的安全限制。
同源策略:所谓同源是指:协议,域名,端口均相同。即便两个不同的域名指向同一个ip地址,也非同源。
http://www.123.com/index.html 调用 http://www.123.com/server.php (非跨域)
http://www.123.com/index.html 调用 http://www.456.com/server.php (主域名不同:123/456,跨域)
http://abc.123.com/index.html 调用 http://def.123.com/server.php (子域名不同:abc/def,跨域)
http://www.123.com:8080/index.html 调用 http://www.123.com:8081/server.php (端口不同:8080/8081,跨域)
http://www.123.com/index.html 调用 https://www.123.com/server.php (协议不同:http/https,跨域)
请注意:localhost和127.0.0.1虽然都指向本机,但也属于跨域。
浏览器执行javascript脚本时,会检查这个脚本属于哪个页面,如果不是同源页面,就不会被执行。
三.为什么会存在浏览器跨域限制?
既然目前各主流浏览器都存在跨域限制,那么为什么一定要存在这个限制呢?如果没有跨域限制会出现什么问题?
浏览器同源策略的提出本来就是为了避免数据安全的问题,即:限制来自不同源的“document”或脚本,对当前“document”读取或设置某些属性。
如果没有这个限制,将会出现什么问题?不妨看一下几个情形:
可能a.com的一段JavaScript脚本,在b.com未曾加载此脚本时,也可以随意涂改b.com的页面。
在浏览器中同时打开某电商网站(域名为b.com),同时在打开另一个网站(a.com),那么在a.com域名下的脚本可以读取b.com下的Cookie,如果Cookie中包含隐私数据,后果不堪设想。
因为可以随意读取任意域名下的Cookie数据,很容易发起CSRF攻击。
所以,同源策略是浏览器安全的基础,同源策略一旦出现漏洞被绕过,也将带来非常严重的后果,很多基于同源策略制定的安全方案都将失去效果。
四.对于浏览器来说,哪些资源(操作)会受到同源策略的限制?
对于浏览器来说,除了DOM,Cookie,XMLHttpRequest会受到同源策略的限制外,浏览器加载的一些第三方插件也有各自的同源策略。
最常见的一些插件如Flash,Java Applet,Silverlight,Google Gears等都有自己的控制策略。
另外,存储在浏览器中的数据,如LocalStorage和IndexedDB,以源进行分割。每个源都拥有自己单独的存储空间,一个源中的Javascript脚本不能对属于其它源的数据进行读写操作。
五.浏览器跨域限制会带来什么问题?
随着互联网的发展,对用户体验的要求越来越高,AJAX应用也就越发频繁,AJAX的本质就是XMLHttpRequest。
但XMLHttpRequest受到同源策略的约束,所以不能跨域访问资源,这与我们的期望是相违背的。
解决办法:
1、JSONP:
使用方式就不赘述了,但是要注意JSONP只支持GET请求,不支持POST请求。
2、代理:
例如www.123.com/index.html
需要调用www.456.com/server.php
,可以写一个接口www.123.com/server.php
,由这个接口在后端去调用www.456.com/server.php
并拿到返回值,然后再返回给index.html
,这就是一个代理的模式。相当于绕过了浏览器端,自然就不存在跨域问题。
3、PHP端修改header(XHR2方式)
在php接口脚本中加入以下两句即可:
header('Access-Control-Allow-Origin:*');
//允许所有来源访问
header('Access-Control-Allow-Method:POST,GET');
//允许访问的方式
什么是跨域?什么情况下会发生跨域请求?相关推荐
- Goroutine调度时机-什么时候和什么情况下会发生调度?
原文地址:Goroutine调度时机-什么时候和什么情况下会发生调度? Go调度器会在以下三种情况对goroutine进行调度: goroutine执行某个操作因条件不满足需要等待而发生的调度. go ...
- 什么情况下会发生full Gc?如何排查频繁发生full Gc的原因?
GC就是Java的垃圾回收机制,要了解什么情况下会发生GC(即GC得触发条件),我们需要先了解JVM的内存模型结构,之前一篇文章已经详细讲解了Jvm的内存模型结构,而通常来说,GC主要针对的是堆(ja ...
- 如何设置iframe高度自适应,在跨域的情况下能做到吗?
2019独角兽企业重金招聘Python工程师标准>>> 在页面上使用iframe来动态加载页面内容是网页开发中比较常见的方法.在父页面中给定一个不带滚动条的iframe,然后对属性s ...
- 什么情况下会发生Full GC?
1.调用System.gc()时 当调用System.gc()时,是建议JVM进行Full GC,只是建议,不是一定会发生,但一般情况下,JVM也会进行Full GC,进行Full GC时会让用户线程 ...
- 038、JVM实战总结:200小时积累,6小时烹制,史上最强图,图解:大厂面试题,Young GC和Full GC分别在什么情况下会发生?
今天学习本讲,按照艾宾浩斯遗忘曲线应该复习:37 35 31 24 9.建议大家按照遗忘曲线来复习学过的内容. 这是本人花了6个小时,精心绘制的"垃圾回收"活动图,同时进行了文字总 ...
- 史上最强图,图解:大厂面试题,Young GC和Full GC分别在什么情况下会发生?
在原文基础上重新绘制了一下进行Young GC .Full GC 的条件及处理过程(原文链接 https://blog.csdn.net/dingshuo168/article/details/987 ...
- 并发insert情况下会发生重复的数据插入问题
1.背景 用多线程接收推送的订单数据,把接收的订单数据存到一个表中,实现的需求是:如果接收的订单消息在数据库中已经存在,那么执行update操作:如果没有存在,那么执行insert操作 代码逻辑: i ...
- c语言浮点乘法 溢出,浮点加减乘除运算各在什么情况下会发生溢出?
满意答案 w9o7w429 2014.01.10 采纳率:52% 等级:12 已帮助:2903人 溢出的原因只有一个 那就是这句 c=a/b 其中b的值为0 也就是 b=cint(request ...
- requests在电脑开启代理的情况下无法正常发送请求
requests.exceptions.SSLError: HTTPSConnectionPool(host='www.pinterest.com', port=443): Max retries e ...
最新文章
- linux python版本_linux下更新Python版本并修改默认版本
- 前后端API交互如何保证数据安全性?
- Python的IDE:利用MyEclipse2017软件的PyDev插件实现Python编程
- Jacoco的原理(各个覆盖率的解释)
- SAP UI5 应用开发教程之五:视图控制器初探
- 商海致富独家秘诀:微笑可以当钱花
- 2018年三月份计算机一级考试试题,2018年3月计算机一级考试MSOFFICE模拟试题(4)
- 【英语学习】【English L06】U07 Jobs L5 Work overtime
- AutoPtr 的局限性
- Android 中文 API (24) —— MultiAutoCompleteTextView.CommaTokenizer
- html三个div相同高度,Html三个div并排,高度相同
- 如何在 EXCEL 2003 插入的方框内打对勾,复选框
- phpcms 允许英文目录有空格
- Chrome浏览器首次打开后未响应较长时间
- 第 7 章 Database design E-R diagram
- 【100 种语言速成】第 6 节:Tcl/Tk
- java门禁系统实训,Java 并发课题 : CyclicBarrier 打造一个安全的门禁系统
- 【浑水摸鱼】化学方程式默写练习器
- 关于tomcat启动后马上又自动关闭的问题
- Smartbi带你了解“更智能”的透视分析