JSONP 跨域

题目1: 什么是同源策略

答:

  • 协议相同 (http https ftp file ...)

  • 域名相同 (域名是第一个//到第一个/之间的部分)

  • 端口相同 (默认端口是80)
    满足以上即为同源。

  • 同源策略: 同源策略限制从一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的关键的安全机制。

题目2: 什么是跨域?跨域有几种实现形式

答:
跨域:不满足以上同源条件,即请求跨域。

ajax不能跨域

实现跨域的四个方法: JSONP、CORS、降域、PostMessage

题目3: JSONP 的原理是什么

答:
JSONP,网页通过添加一个<script>元素,向服务器请求JSON数据,这种做法不受同源政策限制;服务器收到请求后,将数据放在一个指定名字的回调函数里传回来。

浏览器端:

    <script>
        var script = document.createElement('script')
        script.setAttribute('src','http://127.0.0.1:8080/test?cb=foo') //跨域,注意参数为函数名

        document.head.appendChild(script) //添加节点,js执行执行,即执行获取到的 foo(data) 的代码
        document.head.removeChild(script) //执行完去掉多余节点

        function foo(data) {
          console.log('hello world ' + data)
        }
    </script>

服务器端:

    router.get('/test', function(req, res) {
        var callback = req.query.cb
        var data = '"this is jsonp"'   
        res.send(callback+ '(' + data + ')') //返回了foo(data),浏览器端就当js代码执行调用foo(data)
    })

题目4: CORS是什么

答:
跨域资源共享( CORS )机制允许 Web 应用服务器进行跨域访问控制,从而使跨域数据传输得以安全进行。

浏览器发现这次跨源AJAX请求是简单请求,就自动在头信息之中,添加一个Origin字段(协议 + 域名 + 端口)。
服务器可以指定对哪些Origin字段的请求进行响应。

浏览器端:

    <script>
        var xhr = new XMLHttpRequest()
        xhr.onload = function() {
            if (xhr.status === 200 || xhr.status === 304) {
                console.log(JSON.parse(xhr.responseText))
            } 
        }
        xhr.open('get', 'http:127.0.0.1:8080/test', true) 
        xhr.send()
    </script>

服务器端:

    router.get('/test', function(req, res) {
        console.log('req!')
        res.header('Access-Control-Allow-Origin',"*")
        res.send(['this is cors'])
    })

题目5: 根据视频里的讲解演示三种以上跨域的解决方式

答:

JSONP和CORS见题目3、4。

PostMessage实现跨域:

a.html

    <script>
      //URL: http://a.jrg.com:8080/a.html
      $('.main input').addEventListener('input', function(){ //a发消息到b
        console.log(this.value);
        window.frames[0].postMessage(this.value,'*');
      })
      window.addEventListener('message',function(e) {//a接收b的消息
          $('.main input').value = e.data
          console.log(e.data);
      });
      function $(id){
        return document.querySelector(id);
      }
    </script>

b.html

    <script>
      // URL: http://b.jrg.com:8080/b.html
      $('#input').addEventListener('input', function(){//b发消息到a
        window.parent.postMessage(this.value, '*');
      })
      window.addEventListener('message',function(e) {//b接收a的消息
          $('#input').value = e.data
          console.log(e.data);
      });
      function $(id){
        return document.querySelector(id);
      } 
    </script>

降域实现跨域:

假设 a.jrg.com 和 b.jrg.com 要相互访问数据,用以下方法可以降域到jrg.com,实现跨域。

document.domain = 'jrg.com';

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 题目1: 什么是同源策略 浏览器出于安全考虑,只允许与本域下的接口交互。不同源的客户端脚本在没有明确授权的情况下,...
    saintkl阅读 243评论 0 0
  • 什么是同源策略 同源政策(same-origin policy)是指同域名(或ip),同端口,同协议视为同一个域,...
    小囧兔阅读 560评论 0 1
  • 1: 什么是同源策略 最初,它的含义是指,A网页设置的 Cookie,B网页不能打开,除非这两个网页"同源",所谓...
    好奇而已阅读 317评论 0 0
  • 题目1: 什么是同源策略 同源策略(Same Origin Policy): 浏览器出于安全方面的考虑, 只允许与...
    cctosuper阅读 246评论 0 1
  • 【1024今日话题】 “年纪越大,越没有人原谅你的贫穷”。你怎么看这句话?(话题来自猫友豆豆掌门) ———————...
    朱朱的餐具阅读 154评论 0 1