JavacScript

JavaScript 通信 / CORS、WebSocket

2018-01-02  本文已影响0人  羊烊羴
WebSocket

webSocket是H5发布的一种新的协议,可以看做是一种独立的建立在TCP协议上的新协议,能够运用在客户端和服务器端,通过基于事件的方式,赋予浏览器实时通信的能力,也就是说服务端和客户端可以同时发送并响应请求,webSockets的目标是在一个单独的持久连接上提供全双工,双向通信,在Javascript中创建了webSOCket之后,会有一个HTTP请求发送到浏览器以发起连接,在取得服务器响应后,建立的连接会使用HTTP升级重HTTP协议交换为WebCocket协议,也就是说,只有支持WebSocket协议的服务器才能正常工作
由于WebSocket使用了自定义的协议,所以URL的模式也会略有不同。未加密的连接不再是http://,而是ws://;加密的连接也不是https://,而是wss://
WebSocket协议发送的数据包很小,因此非常适合移动应用,而且WebSocket只需要在建立连接的时候发送一次Headers
WebSocket也存在着一些缺陷,它的制定协议的事件比制定JavaScript API的时间还要长,并且存在一定的一致性和安全性的问题
下面我们来看一下WebSocket的使用

<script>
    function WebSocket(){
        var ws;
        ws=new WebSocket("ws://localhost:5000");
        ws.onopen=function(){//建立WebSocket连接时触发这个事件
            console.log("客户端已经建立连接")
        }
        ws.send()//客户端向服务器发送数据
        ws.onmessage=function(e){//有数据从客户端传来时触发,e.data数传过来的数据
            console.log("这是服务端传过来的数据"+e.data)
        }
        ws.onclose=function(){//WebSocket连接断开时触发
            console.log("已经和服务器断开连接")
        }
        ws.onerror=function(e){//WebSocket连接出现错误时触发,e.data是错误信息
            console.log("发生错误,错误信息为"+e.data)
        }
        ws.close()//关闭WebSocket连接
    }
</script>

同样,在WebSocket中,浏览器也会向服务器预先发送请求头

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com

在这些信息中

  1. Origin
    表明发送的请求源,也就是客户端的url地址
  2. Upgrade:websocket
    Connection: Upgrade
    表明发送的请求是WebScoket连接请求
  3. Sec-WebSocket-Key
    这个是一个Base64 encode的值,这个是浏览器随机生成的,用来验证服务器是不是一个WebSocket的连接
  4. Sec-WebSocket-Protocol
    这个是用户第一的字符串,用来区分同URL下不同服务器所需要的协议
  5. Sec-WebSocket-Version
    表明WebSocket的版本号
    服务端会返回
  6. HTTP/1.1 101 Switching Protocols
    表示成功建立链接
  7. Upgrade:websocket
    Connection: Upgrade
    表示建立的链接是WebSocket连接
  8. Sec-WebSocket-Key
    表示服务端经过确认加密后的的秘钥
  9. Sec-WebSocket-Protocol:chat
    表示服务器最终使用的协议

WebSocket不受同源策略的限制,WebSocket的使用的局限性主要是由于浏览器的不兼容,IE10+以上才支持该方法,在不支持的浏览器中我们需要使用长连接的方法来模拟这个效果

CORS

CORS是一个W3C的标准,全称是跨域资源共享(Cross-origin resource sharing),它允许客户端向跨域的服务器发送XMLHttpRequest请求,从而克服了Ajax受到的同源策略的使用限制
CORS需要浏览器和服务器的同时支持,目前所有现代浏览器都支持CORS,IE10+以上都版本都支持CORS,整个CORS的过程都是浏览器完成的,不需要用户参与,对于开发者来说,CORS的请求和Ajax的请求没有区别,代码完全一样,浏览会自动检测,发现如果是使用Ajax请求跨域,就会自动添加一些附加的头信息,或者一次附加的请求
因此,实现CORS的关键在于服务器,只要服务器实现了CORS的接口,就可以实现跨源通信
浏览器将CORS分为了两类:简单请求和非简单请求

与jsonP相比,CORS的跨域更加安全和灵活,缺点是浏览器兼容问题,不过未来CORS会是主流的选择

上一篇下一篇

猜你喜欢

热点阅读