【问题标题】:Spring websockets SockJS fallback protocols are not working out of the box?Spring websockets SockJS 后备协议不能开箱即用?
【发布时间】:2017-02-17 21:23:39
【问题描述】:

我用spring boot 制作了一个支持websockets 的应用程序。一切都是 工作得很好。我正在使用SockJS + Stomp。不用担心。它只是工作。但 现在我想支持SockJS 使用其后备协议的能力。和 它似乎不是开箱即用的。

这是我添加端点的方式:

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/ws").withSockJS();
}

就是这样。没有更多的配置。

现在,当我在浏览器中禁用 webcokets 并尝试启动我的应用程序时,我得到了 404 用于 SockJS 尝试用作后备的传输。

看到了吗?首先GET /ws/iframe.html 404 然后POST /ws/**/xhr_send?t=... 也是404。 这是什么意思?我是否必须开发其他东西以便SockJS 回退协议会起作用吗?

【问题讨论】:

  • 你在这个问题上有什么进展吗?
  • @fynn no :( 仍然想要解决方案。有趣的是知道我并不孤单
  • 这方面有什么进展吗?

标签: java spring websocket spring-websocket sockjs


【解决方案1】:

如果找不到会话 ID,xhr_send 端点返回 404。

如果您的 Websocket 服务扩展到多个实例,根本原因可能是会话是用一个实例启动的,而其他实例不知道它。

可能的修复:

  • 粘性会话 - 将来自客户端的所有请求路由到同一实例
  • 分布式状态 - 在实例之间共享用户会话

【讨论】:

  • 只是spring webapp的一个实例。没什么复杂的。
  • 我发现了一件有趣的事情,即使会话 cookie 通过 application.properties 重命名并且因此拒绝所有回退策略的 xhr 调用,spring 仍在搜索“jsessionid”。请参阅“org.springframework.web.socket.sockjs.transport.TransportType”(Spring Boot 2.2.2)。这应该被报告为错误吗?
  • @zakjan 我在使用多实例解决方案时遇到了这个问题,您有任何关于我如何分配状态的示例吗?我尝试使用 spring-session 但我仍然遇到同样的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-21
  • 2013-01-20
  • 2013-11-13
  • 2015-12-16
相关资源
最近更新 更多