WebSocket握手期间出错:意外的响应代码:400 Spring Boot WebSockets

4

我正在尝试实现WebSockets。我的代码:

在Spring Security中,我允许路径w/e进行身份验证

@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
    httpSecurity.csrf()
            .disable()
            .authorizeRequests()
            .antMatchers("/register","/login","/testAuth","/web","/ws").permitAll()
            .anyRequest().authenticated()
            .and()
            .exceptionHandling()
            .authenticationEntryPoint(jwtAuthenticationEntryPoint)
            .and()
            .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    httpSecurity.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);
}

以及针对ws的配置

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {


    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new WsMessageHandler(), "/ws")
                .addInterceptors(new CustomInterceptor())
                .setAllowedOrigins("*")
                .setHandshakeHandler(new DefaultHandshakeHandler())
                .withSockJS();
    }
}

`

  public class CustomInterceptor implements HandshakeInterceptor {
        @Override
        public boolean beforeHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Map<String, Object> map) throws Exception {
            return true;
        }
    
        @Override
        public void afterHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, @Nullable Exception e) {
    
        }
    }

作为客户端,我使用简单的js代码:

var exampleSocket = new WebSocket("ws://localhost:8080/ws", "protocolOne");
           exampleSocket.onopen = function() {
              
              // Web Socket is connected, send data using send()
              ws.send("Message to send");
              alert("Message is sent...");
           };

然而我收到错误信息:

WebSocket连接到'ws://localhost:8080/ws'失败:WebSocket握手期间出错:意外的响应代码:400

这是什么原因?一切都应该是正确的。感谢回答。
2个回答

9

我发现你的代码有一些错误:

  1. 如果你使用WebSocket()作为客户端,你应该在WebSocketConfig中注释掉withSocktJS(),如下:
@Configuration
@EnableWebSocket
public class WebSocketConfig2 implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new WsMessageHandler(), "/ws")
                .addInterceptors(new CustomInterceptor())
                .setAllowedOrigins("*")
                .setHandshakeHandler(new DefaultHandshakeHandler())
//                .withSockJS()
        ;
    }
}

  • 你的客户端js代码有问题,没有ws。你应该使用exampleSocket来发送消息,就像下面这样:
  •                 var exampleSocket = new WebSocket("ws://localhost:8081/ws", "protocolOne");
                    exampleSocket.onopen = function(ws) {
                        console.log('-----------------', ws);
                        // Web Socket is connected, send data using send()
                        exampleSocket.send("Message to send");
                        alert("Message is sent...");
                    };
    
    

    当客户端发送websocket时,你会指定一个名为“protocolOne”的协议,你需要在CustomInterceptor中将其返回。你可以按照以下方式操作。
    public class CustomInterceptor implements HandshakeInterceptor {
        @Override
        public boolean beforeHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Map<String, Object> map) throws Exception {
            return true;
        }
    
        @Override
        public void afterHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, @Nullable Exception e) {
            if(serverHttpRequest.getHeaders() == null )
                return ;
            if(serverHttpRequest.getHeaders().get("Sec-WebSocket-Protocol") == null)
                return ;
            String protocol = (String) serverHttpRequest.getHeaders().get("Sec-WebSocket-Protocol").get(0);
            if(protocol == null)
                return ;
    
            serverHttpResponse.getHeaders().add("Sec-WebSocket-Protocol", protocol);
    
        }
    
    }
    
    

    0

    你的客户端代码有一个问题,你不需要传递ws,而是将其改为http 在这里输入图像描述

    在这里你可以看到http后面跟着localhost和端口,如果没有的话就是默认端口,然后是你配置的路径


    你的回答可以通过提供更多支持性的信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的回答是否正确。你可以在帮助中心找到更多关于如何撰写好回答的信息。 - undefined

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接