【问题标题】:WebSocket (Sockjs and Stomp) with ServiceWorkers带有 ServiceWorkers 的 WebSocket(Sockjs 和 Stomp)
【发布时间】:2016-05-02 06:36:52
【问题描述】:

我正在使用 Stomp 和 Sockjs 向我的 Spring Boot 独立服务器 (3.1.1) 注册一个 websocket,一切正常。但是,我已经实现了一个 ServiceWorker 来处理离线服务,除了套接字之外,它都可以正常工作。对 ws://localhost/registerSocket 的调用在前端产生了这个错误:

Firefox 无法与位于 ws://localhost/registerSocket/351/4vevdv79/websocket 的服务器建立连接。

这在后端:

错误 o.s.w.s.s.s.DefaultHandshakeHandler - 由于升级标头无效,握手失败:null

在我的 ServiceWorker 中,我已明确将其排除在拦截 ws 请求之外:

if (uri.indexOf("/registerSocket") === -1) {
   event.respondWith(getResponse(event));
}

然而,ws 升级不可避免地会失败,它会恢复为旧的彗星样式 polyfill。

有人知道让 websocket 与 ServiceWorker 一起正常工作的方法吗?

【问题讨论】:

  • 我不确定 Web 套接字连接是否被服务人员拦截,我认为不是。不过,您的 sn-p 中有一个错误,event.responseWith 应该是 event.respondWith。您能否尝试在 'fetch' 事件中添加一些日志记录,看看它是否在您打开 Web 套接字时被触发?
  • 是的。我已经广泛记录了它。我不确定它是否应该拦截它们。根据一些网站,它只应该拦截http请求。也许这只是浏览器实现中的一个错误?
  • 我不这么认为,你能分享你的源代码吗?

标签: html websocket stomp sockjs service-worker


【解决方案1】:

我刚刚发现了 Firefox 44 中的一个错误,该错误会在使用 Service Worker 时阻止 Web Socket 连接工作。

this bug report

现在应该修复该错误(从 Firefox 44.0.1 开始;甚至在 release notes 中)。

【讨论】:

    【解决方案2】:

    服务工作者中的fetch 事件处理程序只有triggered in response to HTTP requests。打开 WebSocket 或通过该 WebSocket 传输数据的请求不会触发 fetch 事件处理程序,这意味着服务工作者不会参与其中。

    【讨论】:

    • 谢谢。您使用将来时是否是为了表达浏览器的实现可能还不符合规范?
    • 不,我不想用“will”来暗示将来时态。我将编辑我的回复以澄清。
    • 啊,好的。感谢您的澄清。然而。事实仍然是,当我不包含服务工作者并从 about:serviceworkers 取消注册它时,ws 升级会正常进行。当我包括服务人员时,它失败了。我唯一要改变的是navigator.serviceWorker.register('/service-worker.js') 电话。
    猜你喜欢
    • 2016-07-04
    • 2015-01-25
    • 2017-05-29
    • 2017-10-04
    • 2016-03-21
    • 2017-06-05
    • 2016-11-09
    • 1970-01-01
    • 2014-10-18
    相关资源
    最近更新 更多