浅析CORS、SSE 和 WebSockets

2016-02-26  本文已影响773人  youngBrain1893

近期在重新看《JavaScript高级程序设计》记录记录每天新看的东西,做个小总结。

CORS

通过 XHR 实现 Ajax 通信的一个主要限制,来源于跨域安全策略。默认情况下 XHR 对象只能访问与包含它的页面位于同一域中的资源。这种安全策略可以预防某些恶意行为。

CORS(Cross-Origin Resource Sharing,跨源资源共享)是 W3C 的一个工作草案,定义了必须访问跨域资源时,浏览器与服务器之前应该如何沟通(使用自定义的 HTTP 头部让浏览器和服务器进行沟通,从而决定请求或响应是应该成功,还是应该失败)。

简单的使用 GET 或 POST 发送请求时,给请求添加一个额外的 Origin 头部,其中包含请求页面的源信息(协议、域名和端口),以便服务器根据这个头来决定是否给予响应。

如果服务器认为这个请求可以接受,就在 Access-Control-Allow-Origin 头部中回发相同的源信息(如果是公共资源,可以回发'*')。

请求和响应都不包含 cookie 信息。

CORS的实现:


SSE

SSE 是围绕只读 Comet 交互推出的 API。
SSE API 用于创建到服务器的单向连接,服务器通过这个连接可以发送任意数量的数据。
服务端响应的 MIME 类型必须是 text/event-stream。
SSE 支持短轮询、长轮询和 HTTP 流,而且能在断开连接时自动确定何时重新连接。

var source = new EventSource('myevents.php');
souce.onmessage = function(event) {
    var data = event.data;
    // process data;
}

SSE 实例对象具有 readyState 属性。

关闭一个 EventSource 对象通过调用 close() 方法,要求强制断开连接并且不再重新连接。

SSE 服务端发送的数据 MIME 头必须是 text/event-stream。响应的格式是纯文本,且带有 data:前缀。

Web Sockets

Web Sockets 用于建立一个单独的持久连接上提供全双工、双向通行。

使用 Web Sockets 必须使用对应的协议 http:// => ws://https:// => wss://
使用自定义协议的好处是数据量小,不必担心 HTTP 那样字节级的开销。

HTTP => Web Sockets:
在 JavaScript 中创建了 Web Socket 后,会有一个 HTTP 请求发送到服务器以发起连接。客户端在收到服务器响应后,建立的连接会使用 HTTP升级 从 HTTP协议交换为 Web Socket 协议。标准的 HTTP 无法实现 Web Sockets,只有支持这种协议的专门服务器才能正常工作。


SSE 和 Web Sockets 的选择

面对具体用例,考虑是使用 SSE 还是 Web Sockets 时,可从以下两个因素考虑:

上一篇 下一篇

猜你喜欢

热点阅读