Jq_javascript跨域问题
为什么浏览器不能跨域
现在很多人特别是前端开发人员,在ajax请求,XMLHttpRequest的过程中会碰到一个问题,那就是跨域请求:
当我们javaScript脚本试图跨域访问时,浏览器会告诉你类似于No 'Access-Control-Allow-Origin' header is present on the requested resource.的消息。
可是我有时候又有跨域请求的强烈需求,比如需要去别的网站抓取一些数据(当然现在有很多方法来支持跨域,但这不是本文要讲的内容)。原来这是浏览器的一个策略----“同源策略”。
1. 什么是同源策略(Same Origin Policy)?
所谓同源策略,它是浏览器的一种最核心最基本的安全策略。它对来至不同源的文档或这脚本对当前文档的读写操作做了限制。
为什么要有这个策略,想必你已经知道,那就是因为保证用户的信息安全。
2. 假如没有同源策略
假设现在有a.com和b.com两个域,如果没有这一安全策略,那么当用户在访问a.com时,a.com的一段脚本就可以在不加载b.com的页面而随意修改或者获取b.com上面的内容。这样将会导致b.com页面的页面发生混乱,甚至信息被获取,包括服务器端发来的session。这样的话,我们的web世界将是一片混乱。也是因为浏览器的同源策略,保证来至不同源的对象不会互相干扰,保证了我们访问页面最基本的安全。
3. 什么是跨域?
访问同源的资源是被浏览器允许的,但是如果访问不同源的资源,浏览器默认是不允许的。访问不同源的资源那就是我们所说的跨域
图片来源:http://www.cnblogs.com/rainman/archive/2011/02/20/1959325.html
从表中可以看出域名,子域名,端口号,协议不同都属于不同源,当脚本被认为是来至不同源时,均被浏览器拒绝请求。
4. src可以跨域
在这里需要注意的是,文档中的所有带“src”属性的标签都可以跨域加载资源,而不受同源策略的限制。
如<script>、<img>、<iframe>、<link>等。如果你在页面定义了这些标签,在页面加载事都对不同源的资源发起了一次GET请求。但是通过src加载的资源,浏览器限制了脚本对其返回的内容无法读写。特别是在ajax请求的时候,特别要注意XMLHttpRequest的时候是无法跨域访问的。
5. 注意
当我们b.com在页面加载不同源的资源时 <script src='a.com/a.js'></script> ,对于页面来说,a.js是运行在b.com上的,因此对于当前页面来说,a.js的源(Origin)是b.com而不是a.com。
因此页面内存放的资源的域a.com并不重要,重要的是加载资源的页面所在的域b.com。
最新文章
- iOS开发常用校验
- 无密钥登录的自动脚本实现(ssh-copy-id、expect免交互输入脚本)
- Linux 如何解决 xhost: unable to open display ";";
- [django]在virtualenv下安装的第三方库的使用方法
- 【转】 CSS3实现10种Loading效果
- 使用ImageNet在faster-rcnn上训练自己的分类网络
- 【BZOJ 2005】[Noi2010]能量采集
- iOS开发中关于UIImage的知识点总结
- java面试题集3
- SVN 无法连接主机:由于目标计算机积极拒绝,无法连接
- Akka(8): 分布式运算:Remoting-远程查找式
- poj 2115 Matrix
- mysql开启远程登陆(修改数据表和授权两种方法)
- 2.02-request_header_two
- solr 中文分词器IKAnalyzer和拼音分词器pinyin
- [20170713] 无法访问SQL Server
- JAXB注解 @XmlRootElement 及XML文件解析详解
- 20155331《网络对抗》 Exp9 Web安全基础
- 20155232 2016-2017-3 《Java程序设计》第9周学习总结
- BZOJ 3143 游走 | 数学期望 高斯消元
热门文章
- 忘了mysql密码咋么办?
- Coursera-AndrewNg(吴恩达)机器学习笔记——第四周
- mysql 大文件导入导出
- MySQL面试题36道
- 如何创建只读权限oracle账户
- November 15th, 2017 Week 46th Wednesday
- Java ThreadLocal的使用案例
- Scala学习之路 (六)Scala的类、对象、继承、特质
- Oracle RMAN 恢复数据库到不同主机(二)
- Posts Tagged ‘This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register问题的解决办法