• js通信相关


    1.什么是同源策略及限制

    •  一个源包含三部分内容:协议、域名、端口
    • 限制:不是一个源的文档操作不了另一个源的文档,主要限制在三个方面
    1. cokkie、localstorage、和indexDB无法读取
    2. DOM无法获得
    3. Ajax请求不能发送

    2.前后端如何通信

    • ajax,同源下的通信方式
    • webSocket不受同源策略的显示
    • CORS及能同源通信也能不同源通信


    3.如何创建ajax要考虑以下几点:

    • XMLHttpRequest对象的工作流程
    • 兼容性处理
    • 事件的触发条件
    • 事件的触发顺序

    4.跨域通信的几种方式

    • JSONP:参考资料:JSONP
    1. 原理:Web页面上调用js文件时则不受是否跨域的影响,src这个属性拥有跨域的能力   
    2. ajax和JSONP的区别
      • ajax和jsonp这两种技术在调用方式上“看起来”很像,目的也一样,都是请求一个url,然后把服务器返回的数据进行处理,因此jquery和ext等框架都把jsonp作为ajax的一种形式进行了封装;
      • ajax和jsonp其实本质上是不同的东西。ajax的核心是通过XmlHttpRequest获取非本页内容,而jsonp的核心则是动态添加<script>标签来调用服务器提供的js脚本。
      • 其实ajax与jsonp的区别不在于是否跨域,ajax通过服务端代理一样可以实现跨域,jsonp本身也不排斥同域的数据的获取。
      • jsonp是一种方式或者说非强制性协议,如同ajax一样,它也不一定非要用json格式来传递数据,如果你愿意,字符串都行,只不过这样不利于用jsonp提供公开服务。
      • jsonp不是ajax的一个特例

      3. 怎么实现的

     前端代码:

    //js
    <script type="text/javascript">
        // 得到航班信息查询结果后的回调函数
        var flightHandler = function(data){
            alert('你查询的航班结果是:票价 ' + data.price + ' 元,' + '余票 ' + data.tickets + ' 张。');
        };
        // 提供jsonp服务的url地址(不管是什么类型的地址,最终生成的返回值都是一段javascript代码)
        var url = "http://flightQuery.com/jsonp/flightResult.aspx?code=CA1998&callback=flightHandler";
        // 创建script标签,设置其属性
        var script = document.createElement('script');
        script.setAttribute('src', url);
        // 把script标签加入head,此时调用开始
        document.getElementsByTagName('head')[0].appendChild(script);
        </script>
    
    //jq
    <script type="text/javascript">
         jQuery(document).ready(function(){
            $.ajax({
                 type: "get",
                 async: false,
                 url: "http://flightQuery.com/jsonp/flightResult.aspx?code=CA1998",
                 dataType: "jsonp",
                 jsonp: "callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback)
                 jsonpCallback:"flightHandler",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名,也可以写"?",jQuery会自动为你处理数据
                 success: function(json){
                     alert('您查询到航班信息:票价: ' + json.price + ' 元,余票: ' + json.tickets + ' 张。');
                 },
                 error: function(){
                     alert('fail');
                 }
             });
         });
         </script>

    后端实现的形式:

    flightHandler({
        "code": "CA1998",
        "price": 1780,
        "tickets": 5
    });
    • Hash
    // 利用hash,场景是当前页面 A 通过iframe或frame嵌入了跨域的页面 B
          // 在A中伪代码如下:
          var B = document.getElementsByTagName('iframe');
          B.src = B.src + '#' + 'data';
          // 在B中的伪代码如下
          window.onhashchange = function () {
              var data = window.location.hash;
          };
    • postMessage
    // 窗口A(http:A.com)向跨域的窗口B(http:B.com)发送信息
    Bwindow.postMessage('data', 'http://B.com');
    // 在窗口B中监听
    Awindow.addEventListener('message', function (event) {
        console.log(event.origin);
        console.log(event.source);
        console.log(event.data);
    }, false);
    • WebSocket
    1. 参考资料:WebSocket
    2. 示例代码:
    var ws = new WebSocket('wss://echo.websocket.org');
    
          ws.onopen = function (evt) {
              console.log('Connection open ...');
              ws.send('Hello WebSockets!');
          };
    
          ws.onmessage = function (evt) {
              console.log('Received Message: ', evt.data);
              ws.close();
          };
    
          ws.onclose = function (evt) {
              console.log('Connection closed.');
          };
    • CORS
    1. 它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制
    2. CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10
    3. 浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)
    4. 就是在头信息之中,增加一个Origin字段,Origin字段用来说明,本次请求来自哪个源(协议 + 域名 + 端口)。服务器根据这个值,决定是否同意这次请求。
    5. 参考资料:CORS
    6. 示例代码:
    fetch('/some/url/', {
              method: 'get',
          }).then(function (response) {
    
          }).catch(function (err) {
            // 出错了,等价于 then 的第二个参数,但这样更好用更直观
          });
  • 相关阅读:
    SQL Server 创建触发器(trigger)
    jQuery插件-json2.js
    Opengl创建机器人手臂代码示例
    OpenGL超级宝典完整源码(第五版)
    基于Opengl的太阳系动画实现
    Opengl创建几何实体——四棱锥和立方体
    ubuntu16.04安装labelme
    Visual Studio Command Prompt 工具配置方法
    OpenNi安装示例
    Opencv读取图片像素值并保存为txt文件
  • 原文地址:https://www.cnblogs.com/fangfeiyue/p/7483229.html
Copyright © 2020-2023  润新知