同源:两个页面的协议、域名和端口相同,则认为他们具有相同的源
示例:对http://www.test.com/index.html页面进行同源检测
URL | 是否同源 | 原因 |
---|---|---|
http://www.test.com/other.html | 是 | 同源(端口、域名、端口相同) |
https://www.test.com/about.html | 否 | 协议不同(http与https) |
http://blog.test.com/movie.html | 否 | 域名不同(www.test.com与blog.test.com) |
http://www.test.com:7001/home.html | 否 | 端口不同(默认的80端口与7001端口) |
http://www.test.com:80/main.html | 是 | 同源(端口、域名、端口相同) |
全称Same origin policy 是浏览器提供的一个安全功能
目的:隔离一些潜在的恶意文件
浏览器规定A网站的JavaScript不允许和非同源的网站c之间进行资源的交互
不同源就是跨域 根本原因就是浏览器的同源策略导致的
Ajax能对服务器发起请求,服务器也能正常接收并返回,但是返回到浏览器被同源策略拦截,无法被页面获取
最主要的两种解决方案是JSONP和CORS
JSONP:出现早,兼容性好 缺点是只支持GET请求
CORS:W3C标准,属于跨域Ajax请求的根本解决方案,不兼容低版本浏览器
是JSON的一种‘使用模式’,用于解决主流浏览器的跨域数据访问问题
实现原理:(因为
注:JSONP和Ajax之间没有任何关系,不能把JSONP请求数据的方式叫做Ajax,因为JSONP没有用到XMLHttpRequest这个对象,发起的是一种js脚本类的请求
示例:
- // 发起JSONP请求
- $.ajax({
- url: 'http://ajax.frontend.itheima.net:3006/api/jsonp?name=zs&age=20',
- // 代表我们要发起JSONP请求
- dataType: 'jsonp',
- //发送到服务器端的参数名称,默认值为 callback
- jsonp:'callback',
- //自定义的回调函数名称,默认值为jQueryxxx格式
- jsonpCallback:'abc',
- success: function(res) {
- console.log(res);
- }
- })
默认情况下,使用jQuery发起JSONP请求,会自动携带一个callback=jQueryxxx的参数,jQuery是随机生成的一个回调函数名称
实现过程:jQuery采用的是动态创建和移除