使用 Server-Sent Events 实现跨域通信

阅读时长 4 分钟读完

在前端开发中,经常需要实现跨域通信。传统的跨域通信方式有很多,比如 JSONP、CORS、iframe 等。但是这些方式都有一些局限性,比如 JSONP 只支持 GET 请求,CORS 需要服务器端配合设置等等。这时候,Server-Sent Events(SSE)就成了一个很好的选择。

什么是 Server-Sent Events

Server-Sent Events 是 HTML5 中的一个新特性,它允许服务器向客户端推送事件流,而无需客户端不断地向服务器发起请求。SSE 的优点在于它非常简单易用,而且支持跨域通信。

如何使用 Server-Sent Events

使用 SSE,需要在客户端通过 JavaScript 创建一个 EventSource 对象,然后指定服务器端的 URL。服务器端需要实现一个 HTTP 接口,该接口会返回一个事件流。客户端通过 EventSource 对象监听服务器端的事件流,当服务器端有新的事件发生时,客户端就会收到通知。

下面是一个简单的示例代码:

-- -------------------- ---- -------
-- -----
----- ----------- - --- -----------------------------------------

--------------------------------------- ------- -- -
  ------------------------
---

------------------------------------- ------- -- -
  -------------------------- -------- -------
---
展开代码
-- -------------------- ---- -------
-- -------------- - --------
------------------ ----- ---- -- -
  ---------
    --------------- --------------------
    ---------------- -----------
    ------------- -------------
  ---

  -------------- -- -
    ---------------- ----- ----------------------------
  -- ------
---
展开代码

客户端代码中,我们创建了一个 EventSource 对象,并指定了服务器端的 URL。然后,我们监听了 message 和 error 事件。当服务器端有新的事件发生时,message 事件会被触发,我们可以通过 event.data 获取事件的数据。当连接出错时,error 事件会被触发。

服务器端代码中,我们使用 Express 实现了一个 HTTP 接口。该接口返回的 Content-Type 是 text/event-stream,这是 SSE 的标准 MIME 类型。Cache-Control 设置为 no-cache,这是为了避免缓存。Connection 设置为 keep-alive,这是为了保持长连接。然后,我们使用 setInterval 定时向客户端推送事件流。每隔 1 秒钟,我们就向客户端发送一个事件,事件的数据是当前时间的 ISO 字符串表示。

SSE 的优点和局限性

SSE 的优点在于它非常简单易用,而且支持跨域通信。与传统的 AJAX 请求相比,SSE 可以实现实时推送数据,而且不需要客户端不断地向服务器发起请求,减少了服务器的压力。此外,SSE 还支持断线重连,即使客户端和服务器端的连接中断,客户端也可以自动重连,继续接收事件流。

SSE 的局限性在于它不支持双向通信。也就是说,客户端只能接收服务器端推送的事件,而不能向服务器端发送请求。此外,SSE 也不支持跨域的 cookie 和 HTTP 认证,这可能会影响某些应用程序的实现。

总结

使用 Server-Sent Events 可以实现跨域通信,而且非常简单易用。通过 EventSource 对象和服务器端的 HTTP 接口,可以实现实时推送数据,而且不需要客户端不断地向服务器发起请求,减少了服务器的压力。但是,SSE 也有一些局限性,比如不支持双向通信和跨域的 cookie 和 HTTP 认证。在实际应用中,需要根据具体的场景选择合适的跨域通信方式。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65fbcc33d10417a22275cab3

纠错
反馈

纠错反馈