连接到 websocket 时出现状态 200,但这是一个错误?

I get a status 200 when connecting to the websocket, but it is an error?

我的错误显示在我的浏览器控制台中:

"WebSocket connection to 'ws://localhost:32768/DspClusterWebServices/myHandler' failed: Unexpected response code: 200"

我正在使用 Spring Websockets 4.1.5Tomcat 8.0.18。我的 WebSocketConfigurer 实现 class 看起来像:

@Configuration
@Controller
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer
{
   class MyHandler implements WebSocketHandler
   {
      @Override
      public void afterConnectionEstablished(WebSocketSession session) throws Exception
      {
         System.out.println("afterConntectionEstablished called");
      }

       ...implements rest of functions with a System.out.println and false for supportsPartialMessages()

      }
   }

   @Override registerWebSocketHandlers(WebSocketHandlerRegistry registry)
   {
      registry.addHandler(myHandler(), "myHandler").withSockJS();
   }

   @Bean
   public WebSocketHandler myHandler()
   {
      return new MyHandler();
   }
}

我的 testWebsocketClient.js 尝试连接此代码,但错误代码为 200:

websocket = new WebSocket("ws://localhost:8080/myApp/myHandler");

我不知道接下来要尝试什么。我认为这会导致 afterConnectionEstablished(WebSocketSession session) 方法触发?代码200不好吗?

看看specification 。服务器应响应 101 以表示协议从 http 更改为 ws

请检查http://procbits.com/connecting-to-a-sockjs-server-from-native-html5-websocket

在你附加 /websocket(到你的 URL)之后,它会给你错误

Failed to parse Origin header value [null]

;) ,然后会依次将您带到 that link.

您必须将 .setAllowedOrigins("*") 添加到您的 addHandler() 方法,然后它终于可以工作了!

请检查'ws://localhost:32768/DspClusterWebServices/myHandler'是否正确。

对于像我这样使用 angular + springboot 并出现此错误的人。请检查您是否启用了重定向或将所有非 api 端点请求转发回 index.html。喜欢:

@RequestMapping(value = "/**/{[path:[^\.]*}")
    public String redirect() {
        // Forward to home page so that route is preserved.
        return "forward:/index.html";
    }

如果你这样做,禁用它,你将得到 101

不知道这是否为时已晚,但我偶然发现的一个解决方案是在您在 spring 启动服务器中声明的 websocket 端点之后简单地附加字符串 /websocket。这将有助于保持转发逻辑和连接并建立 websocket 连接。

作为我的另一个回答:[

我用的是springboot 2 +STOMP。

去掉.withSockJS(),就OK了

我不知道原因,但对我有用。