跨域

144 阅读1分钟

同源策略

两个网址的协议域名端口号,完全一致就是同源,只有有一个不同就不是同源。
https://www.baidu.com/https://baidu.com/两个不是同源。
不同源的页面之间,不允许互相访问数据。

CORS

当目标页面的response中,包含Access-Control-Allow-Origin这个header,并且它的值是自己的域名时,浏览器才允许拿它的数据。 基于HTTP头的机制 Access-Control-Allow-Origin:

JSONP

CORS在IE6、7、8、9中不支持
不同源之间是不能互相访问数据的,但是可以引入js文件是不受跨域的影响的,调用js的数据。好在原生JS是支持JSON的。就可以通过与调用JS方式获取自己想要的数据进行处理展示了。

response.statusCode = 200
response.setHeader('Content-Type', 'text/javascript;charset=utf-8')
const string = `window.xxx={{data}}`.toString();//可以是变量 可以是函数
const data = `[{"name": "张三"}]`.toString();
const string2 = string.replace('{{data}}', data)
response.write(string2)
response.end()
response.statusCode = 200
response.setHeader('Content-Type', 'text/javascript;charset=utf-8')
response.write(`
    const script = document.createElement('script')
    script.src = 'http://localhost:8888/chao.js'
    script.onload=()=>{console.log(window.xxx)}
    document.body.appendChild(script)
`)
response.end()

面试题

浏览器不支持CORS,或者某一些原因不支持CORS,我们必须用另外一种方式跨域,于是请求一个JS文件,这个JS文件会执行一个回调,回调里面就有我们要的数据。回调的名字可以用一个随机数生成,当然也可以用其他的,我们把这个名字以callback的方式传给后台,后台会把这个函数返回给我们并执行。 优点: 兼容IE,可以跨域
缺点: 1.script标签,达不到AJAX,不知道状态码是什么,读取不到,也不知道响应头是什么,只知道成功了,还是失败了
2.不支持POST,只能发GET请求