【问题标题】:I get a status 200 when connecting to the websocket, but it is an error?连接到 websocket 时出现状态 200,但这是一个错误?
【发布时间】:2015-07-02 00:02:33
【问题描述】:

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

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

我正在使用Spring Websockets 4.1.5Tomcat 8.0.18。我的 WebSocketConfigurer 实现类如下所示:

@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 不是很好吗?

【问题讨论】:

  • 看看这个,请stackoverflow.com/a/14555549/592355 特别是:“至于您的“意外响应代码:200”错误,我猜您在客户端使用的WebSocket URL没有指向有效的服务器端脚本,但如果没有更多信息,很难对此发表评论。”
  • 需要什么资料?我使用的是Tomcat 8.0.18,可以在Tomcat安装的lib文件夹中看到websocket-api.jar和tomcat-websocket.jar...
  • Controller注解怎么样? (它不在 WebSocket 示例中)...您认为这不会干扰吗?
  • hummm...this 听起来不错:请尝试连接到“ws://localhost:8080/myApp/myHandler/websocket”!?
  • xerx593 请回答包含该链接以及此链接:github.com/spring-projects/spring-boot/issues/2586 添加 websocket 后,它给了我错误“无法解析 Origin 标头值 [null]”,然后导致我到那个链接。我必须将 .setAllowedOrigins("*") 添加到我的 addHandler() 方法中。然后它终于奏效了!如果你回答我会检查它,所以你得到你应得的荣誉

标签: java javascript tomcat websocket spring-websocket


【解决方案1】:

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

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

无法解析 Origin 标头值 [null]

;) ,然后将引导您到that link

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

【讨论】:

  • 就像一个附加组件一样,如果您从服务器代码中删除 .withSockJs() 调用并从客户端代码中删除 /websocket,它也会以这种方式工作!棘手的东西,希望这对未来的人们有所帮助!再次感谢 xerx593 帮助我找到解决方案!
  • Oh my God!!!!真的谢谢!!!这个问题困扰了我3个小时....
  • 我浪费了3天!这有效。哇 !谢谢!
【解决方案2】:

作为我的另一个答案:[https://stackoverflow.com/a/53272666/2930417][1]

我用的是springboot 2 +STOMP。

删除.withSockJS(),一切正常。

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

【讨论】:

【解决方案3】:

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

【讨论】:

  • 我仍然不确定该怎么做,这个链接进一步解释了状态 200 代码:stackoverflow.com/questions/18190644/… 服务器端一定有问题,但我不确定如何,我正在使用雄猫 8.0.18
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    对于像我这样使用 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

    【讨论】:

    • 如果我同时需要redirect()方法和websocket怎么办?
    • @Gleb 将您在角度级别定义的所有路由路径放入值数组中。例如,您在 app.module.ts 中定义了“/login”、“/logout”和“/welcome”路由,并且还有一些以“api”开头的 restful 调用。那么你需要修改注解,比如@RequestMapping(value = {"/login", "/logout", "/welcome", "/api/**"})
    • @forguta 只需删除您的 websocket 处理程序...?
    • 这对我有帮助:github.com/jhipster/generator-jhipster/issues/9591。 (我正在使用 jhipster)
    【解决方案6】:

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

    【讨论】:

      猜你喜欢
      • 2015-08-11
      • 1970-01-01
      • 1970-01-01
      • 2017-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-09
      • 2014-12-16
      相关资源
      最近更新 更多