简单聊聊:同源、跨域、CORS、JSONP

跨域

说到跨域,有跨就要有同,我们需要先了解一下同源

什么是源,当我在网页开发者模式输入F12然后 window.origin 时,会得到一串数据

,这个就是源

源 = 协议 + 域名 + 端口号 

如果两个rul完全一致,那么这个就叫同源, www.baidu.com !== baidu.com

同源策略

同源策略就是:不同源的页面之间,不准互相访问数据。

所以 跨域 就是

不同域名、不同端口、不同IP之前进行相互的数据访问。

 

如何 跨域 ?

两种方式:

  • CORS
  • JSONP

CORS

想要跨域访问也很简单只需要在后台的数据请求中写入

response.setHeader(’Access-Control-Allow-Origin':'https://xxx.com');//写上对应的网址

JSONP

  • JSONP是什么:是请求跨域访问的解决方案,通过创造一个script标签 , 这个script标签引用合作网站对应的JS文件,JS就会把数据夹带过来,我们拿到数据
  • 优点:兼容IE、可以跨域
  • 缺点:由于它是script标签,它读不到状态码,也不知道响应头是什么?,只知道成功失败,
  •           只能发get请求,不支持post请求。

例如:

我们自己网站创建一个JS文件,动态创建script引用合作网站的JS文件,我们先封装JSONP

// 封装JSONP用Promise
function jsonp(url) {
    return new Promise((resolve,reject) =>{
        const random = 'flightyang'+Math.random();  //随机生成回调名字
        console.log(random);
        window[random] = (data)=>{
            resolve(data); //成功获取到另一个网站的数据
        };
        const script = document.createElement('script');
        script.src = `${url}?callback=${random}`; //自己设置回调名字
        script.onload = ()=>{  //成功后执行
            script.remove();  //删除掉script标签,我们主要目的是为了获取数据,让首页更加简洁
        };
        script.onerror = ()=>{ //失败
            reject();
        };
        document.body.appendChild(script);
    });
};

//使用JSONP发送请求 jsonp(
'http://qq.com:8888/friends.js') .then((data)=>{ console.log(data); })

 

合作网站的后台

if(path === '/friends.js'){
    /*检查referer,判断只有frank.com网站能访问当前JS */
    if(request.headers["referer"].indexOf("http://frank.com:9990") === 0){
      response.statusCode = 200
      response.setHeader('Content-Type', 'text/javascript;charset=utf-8')
      const string = fs.readFileSync('./public/friends.js').toString();  //读取JS文件--window['{{xxx}}']({{data}})--JS文件的内容
      const data = fs.readFileSync('./public/friends.json').toString();  //读取对应JSON文件的数据JSON,转换成字符串
      /*替换JS里回调名字:xxx给重命名:functionName,并把数据填充到{{data}}里 */
      const string2 = string.replace("{{data}}",data).replace('{{xxx}}',query.callback);
      response.write(string2);
      response.end(); //发送数据
    }else{
      response.statusCode=404;
      response.end();
    }

 

如此,我们就读取到合作网站传递过来的数据。

 

posted @ 2021-03-29 23:39  蛰鸣  阅读(90)  评论(0编辑  收藏  举报