26.1 同源策略
同源的定义:源 = 协议 + 域名 + 端口
浏览器规定: js不允许获取不同源的数据 , 例如: 运行在源A的js, 不允许获取源B的数据
为啥要设置同源策略?
为了保护用户隐私. 用户点击钓鱼网站, 那么这个网站就能模仿用户发送Ajax请求, 这样就会导致隐私泄漏.
隐私泄漏的根源
qq空间的js, 和黑客网页里的js发送的请求几乎没有区别(referer有区别). 后台开发者没有检查referer, 那就完全没有区别.
为什么可以跨域使用css, js和图片等?
同源策略限制的是数据访问, 我们引用css, js, 图片. 但是我们无法知道里面的内容.
26.2 解法一: CORS
后台对浏览器进行提前声明:
else if (path === '/qq.json') {
response.statusCode = 200
response.setHeader('Content-Type', 'text/json;charset=utf-8')
//后台设置响应头, 来告诉浏览器别拦截
response.setHeader('Access-Control-Allow-Origin', 'http://tianzc.com:8889')
let jsString = fs.readFileSync('db/qq.json')
response.write(jsString)
response.end()
}
允许所有:
else if (path === '/qq.json') {
response.statusCode = 200
response.setHeader('Content-Type', 'text/json;charset=utf-8')
//后台设置响应头, 来告诉浏览器别拦截
response.setHeader('Access-Control-Allow-Origin', request.headers['referer'])
let jsString = fs.readFileSync('db/qq.json')
response.write(jsString)
response.end()
}
###26.3 解法二: jsonp 方法
为啥需要jsonp?
ie 6,7,8,9 :说你猜我支持不支持CORS?
jsonp 原理是啥?
利用可以引用不同源的js, 来走私数据.
-
后台传回的js可以定义一个全局变量:
window.__callback__ = [ {"女友1": "新垣结衣"}, {"女友2": "张碧晨"} ] -
后台传回的js可以执行一个回调函数:
window.xxx([ {"女友1": "新垣结衣"}, {"女友2": "张碧晨"} ])
jsonp的p是啥意思?
jsonp的p就是padding, window.xxx就是填充物, padding
jsonp的优化?
-
jsonp方案也可以做referer检查
-
用随机数代替: xxx, 将随机数random通过查询参数传递给给后台.就不会引起冲突, 占用任何全局变量
-
script加载后立马删除
script.onload = ()=>{ script.remove() }
jsonp 优缺点
优点:
- 支持ie
- 支持跨域
缺点:
- script标签: 读不到像AJAX一样精确的状态,
- jsnop是script的不支持post请求.