资讯专栏INFORMATION COLUMN

通信类

Darkgel / 736人阅读

摘要:通信类什么是同源策略及限制同源策略限制从一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的关键的安全机制。源协议域名端口默认三个构成一个源。

通信类 javascript HTTP 1. 什么是同源策略及限制:

同源策略限制从一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的关键的安全机制。
源:协议、域名、端口(默认 80)三个构成一个源。 不是一个源的文档无法去操作另一个源的资源。

限制:

- Cookie、LocalStorage 和 IndexDB 
- Dom 无法获得 
- Ajax 不能发送

2. 前后端如何通信:

Ajax 同源下

WebSocket 不限制

CORS 支持跨源通信 也支持同源通信

3. 如何创建Ajax
XMLHttpRequest 对象的工作流程
兼容性处理(IE 浏览器的处理)
事件的触发条件
事件的触发顺序
if(opt.url){
    // 声明XMLHttpRequest 对象的工作流程
    var xhr = XMLHttpRequest ? new XMLHttpRequest () : new window.ActiveXObject("Microsoft.XMLHTTP");
    var data = opt.data,
        url = opt.url,
        type = opt.type.toUpperCase(),
        dataArr = [];
    for (var k in data) {
        dataArr.push(k + "=" + data[k]);
    }
    if (type === "GET") {
        url = url +"?" + dataArry.join("&");
        xhr.open(type,url.replace(/?$/g,""),true);
        xhr.send();
    }
    if (type === "POST") {
        xhr.open(type,url,true);
        xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
        xhr.send(dataArry.join("&"));
    }
    // 监听它成功失败
    xhr.onload = function () {
        // 200:304:重定向,利用本地缓存
        if (xhr.status === 200 || xhr.status === 304 ) { // 媒体资源加206
            var res;
            if (opt.success && opt.success instanceof Function) {
                res = xhr.responseText;
                if(typeof res === "String") {
                    res = JSON.parse(res);
                    opt.success.call(xhr,res);
                }
            }
        } else {
            if (opt.error && opt.error instanceof Function) {
                opt.error.call(xhr,res); 
                }
            }
        }
    }

4. 跨域通信的几种方式:

JSONP

Hash 「url 地址中 # 后面的东西是 Hash, Hash改变页面不改变」「url 地址中 ?后面的东西是Search,Search 改变页面刷新」

postMessage「Html5 新增的,同源策略限制跨域通信,但实际的开发业务中我们又需要用到跨域通信,所以出现这种方式」

WebSocket「不受同源策略限制」

CORS 「支持跨域通信的 Ajax ,浏览器在识别你用Ajax发送跨域请求时,浏览器会在 HTTP 头中加一个 Origin,如果没有浏览器就会拦截」

代码实例:
var util = {};

 /**
  * [function 在页面中注入js脚本]
  * @param  {[type]} url     [description]
  * @param  {[type]} charset [description]
  * @return {[type]}         [description]
  */
 util.createScript = function (url, charset) {
    var script = document.createElement("script");
    script.setAttribute("type", "text/javascript");
    charset && script.setAttribute("charset", charset);
    script.setAttribute("src", url);
    script.async = true;
    return script;
};

 /**
  * [function jsonp]
  * @param  {[type]} url      [description]
  * @param  {[type]} onsucess [description]
  * @param  {[type]} onerror  [description]
  * @param  {[type]} charset  [description]
  * @return {[type]}          [description]
  */
util.jsonp = function (url, onsuccess, onerror,charset) {
    var callbackName = util.getName("tt_player"); // 加载script标签的形式
    window[callbackName] = function () { // 以这个回调名称注册一个全局的函数
        if (onsuccess && util.isFunction(onsuccess)){
            onsuccess(arguments[0]);
        }
    };
    var script = util.createScript(url + "&callback" + callbackName,charset);
    script.onload = script.onreadystatechange = function () {
        if (!script.readyState || /loaded|complete/.test(script.readyState)) {
            script.onload = script.onreadystatechange = null;
            // 移除该script的 DOM 对象
            if (script.parentNode) {
                script.parentNode.removeChild(script);
            }
            // 删除函数或变量
            window[callbackName] = null;
        }
    };
    script.onerror = function () {
        if (onerror && util.isFunction(onerror)) {
            onerror();
        }
    };
    document.getElementsByTagName("head")[0].appendChild(script);
};


// AJAX
util.extend(opt,options);
if(opt.url){
    // 声明XMLHttpRequest 对象的工作流程
    var xhr = XMLHttpRequest ? new XMLHttpRequest () : new window.ActiveXObject("Microsoft.XMLHTTP");
    var data = opt.data,
        url = opt.url,
        type = opt.type.toUpperCase(),
        dataArr = [];
    for (var k in data) {
        dataArr.push(k + "=" + data[k]);
    }
    if (type === "GET") {
        url = url +"?" + dataArry.join("&");
        xhr.open(type,url.replace(/?$/g,""),true);
        xhr.send();
    }
    if (type === "POST") {
        xhr.open(type,url,true);
        xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
        xhr.send(dataArry.join("&"));
    }
    // 监听它成功失败
    xhr.onload = function () {
        // 200:客户端请求成功 304:重定向,利用本地缓存
        if (xhr.status === 200 || xhr.status === 304 ) { // 媒体资源加206
            var res;
            if (opt.success && opt.success instanceof Function) {
                res = xhr.responseText;
                if(typeof res === "String") {
                    res = JSON.parse(res);
                    opt.success.call(xhr,res);
                }
            }
        } else {
            if (opt.error && opt.error instanceof Function) {
                opt.error.call(xhr,res); 
                }
            }
        }
    }
    
export default util;




    
    
    通信类
    
    
    



    

    
    
    


License

可以拷贝、转发,但是必须提供原作者信息,同时也不能将本项目用于商业用途。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/93275.html

相关文章

  • 基于 Netty 的可插拔业务通信协议的实现「2」特定业务消息对象的设计

    摘要:而实际两者之间的通信使用的是基于的自定义二进制数据帧,对象与数据帧之间需进行转换。该类实现了编码解码方法,故可对消息对象进行编码或对数据帧进行解码。该类的静态方法可通过指定功能消息对象生成相应的回复对象。 本文为该系列的第二篇文章,设计需求为:服务端程序和众多客户端程序通过 TCP 协议进行通信,通信双方需通信的消息种类众多。上一篇文章详细描述了该通信协议的二进制数据帧格式以及基本 J...

    Yuqi 评论0 收藏0
  • PHP常用操作实现——通信数据封装

    摘要:方式是最常用也是最直接的通常用于方法,其实我认为中的表单实质上也是方式,但这种传输方式数据有限,也不规范,只适合一些简单场景。如何封装上面讲了,和是目前主流的通信数据格式,下面就来讲讲如何封装,方便运用。 谢谢大家的收藏与赞,这是对我最大的鼓励。 必要性 不管在B/S架构中,还是C/S架构中,两端的数据通信(注:这里的通信是指的网络请求和回复操作)都无可避免,因为没有数据便没有内容,没...

    YancyYe 评论0 收藏0
  • PHP常用操作实现——通信数据封装

    摘要:方式是最常用也是最直接的通常用于方法,其实我认为中的表单实质上也是方式,但这种传输方式数据有限,也不规范,只适合一些简单场景。如何封装上面讲了,和是目前主流的通信数据格式,下面就来讲讲如何封装,方便运用。 谢谢大家的收藏与赞,这是对我最大的鼓励。 必要性 不管在B/S架构中,还是C/S架构中,两端的数据通信(注:这里的通信是指的网络请求和回复操作)都无可避免,因为没有数据便没有内容,没...

    mudiyouyou 评论0 收藏0
  • 我的Java设计模式-中介者模式

    摘要:那在我们的程序设计中有没有这样的模式有的,中介者模式应运而生,目的就是处理这样的情景问题。最后来看客户端的实现,代码如下被攻打,请求支援可以看到,表面上请求还是从发出,但是已经委托了中介者进行业务逻辑和流程的处理。 本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 小时候钟爱战争片,《地道战》、《鸡毛信》、《铁道游击队》一系列的老电影,咦~想起都激动得起鸡皮疙瘩。不过...

    SimonMa 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<