WebSocket 握手 - 意外响应代码 200 - AngularJs 和 Spring Boot

2022-09-03 03:21:52

当我尝试在AngularJS应用程序和Spring Boot之间建立websocket通信时,我收到错误:websocket握手时出错 - 意外响应代码:200

这是我的JS代码:

function run(stateHandler, translationHandler, $websocket) {
    stateHandler.initialize();
    translationHandler.initialize();

    var ws = $websocket.$new('ws://localhost:8080/socket'); // instance of ngWebsocket, handled by $websocket service

    ws.$on('$open', function () {
        console.log('Oh my gosh, websocket is really open! Fukken awesome!');  
    });

    ws.$on('/topic/notification', function (data) {
        console.log('The websocket server has sent the following data:');
        console.log(data);

        ws.$close();
    });

    ws.$on('$close', function () {
        console.log('Noooooooooou, I want to have more fun with ngWebsocket, damn it!');
    });
}

这是我的Java代码:

WebsocketConfiguration.java

@Override
public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry)
{
    stompEndpointRegistry.addEndpoint("/socket")
        .setAllowedOrigins("*")
        .withSockJS();
}

@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
    registry.enableSimpleBroker("/topic");
}

WebsocketSecurityConfiguration.java

@Override
protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) {
    messages
        // message types other than MESSAGE and SUBSCRIBE
        .nullDestMatcher().authenticated()
        // matches any destination that starts with /rooms/
        .simpDestMatchers("/topic/tracker").hasAuthority(AuthoritiesConstants.ADMIN)
        .simpDestMatchers("/topic/**").permitAll()
        // (i.e. cannot send messages directly to /topic/, /queue/)
        // (i.e. cannot subscribe to /topic/messages/* to get messages sent to
        // /topic/messages-user<id>)
        .simpTypeMatchers(SimpMessageType.MESSAGE, SimpMessageType.SUBSCRIBE).denyAll()
        // catch all
        .anyMessage().denyAll();
}

有没有人知道如何解决这个问题?
提前感谢您!


答案 1

我遇到了类似的问题,我正在使用chrome插件(Simple WebSocket Client)测试我的websocket连接,并尝试连接到 ws://localhost:8080/handler/ 在我的代码中将其定义为但发生了意外错误200。我已经通过将/websocket附加到chrome扩展名上的客户端请求字符串来解决此问题,因此您可以尝试在JS文件中更改以下行:registry.addEndpoint("/handler").setAllowedOrigins("*").withSockJS();

var ws = $websocket.$new('ws://localhost:8080/socket');

 var ws = $websocket.$new('ws://localhost:8080/socket/websocket');

我不知道为什么在我的情况下修复了它的原因,我只是随机偶然发现了它,如果某些1可以澄清它,那将是非常好:)


答案 2

你可以试试这个 WebsocketConfiguration 配置:

@Override
public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry)
{
    stompEndpointRegistry.addEndpoint("/socket").setAllowedOrigins("*");      
    stompEndpointRegistry.addEndpoint("/socket").setAllowedOrigins("*").withSockJS();
}

所以你有websocket和SockJS配置?


推荐