跨域时如何解决和解决 SockJs 的 /info 路径上的 404

Posted

技术标签:

【中文标题】跨域时如何解决和解决 SockJs 的 /info 路径上的 404【英文标题】:How to troubleshoot and resolve 404 on SockJs's /info path when with cross-origin 【发布时间】:2019-05-28 06:26:41 【问题描述】:

我在使用 SockJs 和 CORS 时遇到问题。我用弹簧。我将 WebMvcConfigured 设置如下:

@Bean
public WebMvcConfigurer corsConfigurer() 
    return new WebMvcConfigurer() 
        @Override
        public void addCorsMappings(CorsRegistry registry) 
            registry
                    .addMapping("/**")
                    .allowedOrigins("http://localhost:3000")
                    .allowCredentials(true);
            ;
        
    ;

和WebSocketConfig如下:

    @Override
public void configureMessageBroker(MessageBrokerRegistry config) 
    config.enableSimpleBroker("/topic");
    config.setApplicationDestinationPrefixes("/app");


@Override
public void registerStompEndpoints(StompEndpointRegistry registry) 
    registry
            .addEndpoint("/gs-guide-websocket")
            .setAllowedOrigins("*")
            .withSockJS();

但是,当我的网络客户端尝试 GET 反对 /gs-guide-websocket/info 时,它会得到一个 404

SockJs 的规范要求存在/info 路径。似乎即使我确实在服务器端使用了.withSockJS(),它也没有设置/gs-guide-websocket/info 路径。

我应该如何通过spring 和/或spring-websocket 创建这条路径?

谢谢,

凯文

【问题讨论】:

【参考方案1】:

我没有使用 STOMP 协议,而我已经使用 SockJS 配置了 websocket,这对我来说很好。

此处消息负载已作为响应发送到前端。

CustomWebSocketHandler.java

@Component
public class CustomWebSocketHandler extends TextWebSocketHandler 

    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception 
        String payload = message.getPayload();
        JsonObject jsonObject = new JsonObject();
        jsonObject.addProperty("message", "Session started");
        jsonObject.addProperty("payload", payload);
        session.sendMessage(new TextMessage(new Gson().toJson(jsonObject)));
       

WebSocketConfig.java

@EnableWebSocket
@Configuration
public class WebSocketConfig implements WebSocketConfigurer 

    @Autowired
    private CustomWebSocketHandler customWebSocketHandler;
    
    public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) 

        webSocketHandlerRegistry
            .addHandler(customWebSocketHandler, "/socket")
            .setAllowedOrigins("*")
            .withSockJS()
            .setHeartbeatTime(20);      
    

【讨论】:

以上是关于跨域时如何解决和解决 SockJs 的 /info 路径上的 404的主要内容,如果未能解决你的问题,请参考以下文章

跨域时session丢失问题的解决

vue-cli3 一直运行 sockjs-node info t= 解决方案

vue-cli3 一直运行 /sockjs-node/info?t= 解决方案

vue-cli3 一直运行 /sockjs-node/info?t= 解决方案

[被自己坑了] 在 vue 解决跨域时,config/index.js 的正确编写方式

vue/cli3项目运行报错sockjs-node/info解决方案