跨域时如何对 SockJs 的/info 路径上的 404 进行故障排除和解决 [英] How to troubleshoot and resolve 404 on SockJs's /info path when with cross-origin

查看:225
本文介绍了跨域时如何对 SockJs 的/info 路径上的 404 进行故障排除和解决的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

@Bean公共 WebMvcConfigurer corsConfigurer() {返回新的 WebMvcConfigurer() {@覆盖公共无效 addCorsMappings(CorsRegistry 注册表){登记处.addMapping("/**").allowedOrigins("http://localhost:3000").allowCredentials(true);;}};}

和 WebSocketConfig 如下:

 @Override公共无效 configureMessageBroker(MessageBrokerRegistry 配置){config.enableSimpleBroker("/topic");config.setApplicationDestinationPrefixes("/app");}@覆盖public void registerStompEndpoints(StompEndpointRegistry registry) {登记处.addEndpoint("/gs-guide-websocket").setAllowedOrigins("*").withSockJS();}

但是,当我的 Web 客户端尝试针对 /gs-guide-websocket/info 执行 GET 时,它会收到 404.

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

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

谢谢,

凯文

解决方案

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

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

CustomWebSocketHandler.java

@Component公共类 CustomWebSocketHandler 扩展了 TextWebSocketHandler {@覆盖protected void handleTextMessage(WebSocketSession session, TextMessage message) 抛出异常 {String payload = message.getPayload();JsonObject jsonObject = new JsonObject();jsonObject.addProperty(消息",会话开始");jsonObject.addProperty(有效载荷",有效载荷);session.sendMessage(new TextMessage(new Gson().toJson(jsonObject)));}}

WebSocketConfig.java

@EnableWebSocket@配置公共类 WebSocketConfig 实现 WebSocketConfigurer {@自动连线私有 CustomWebSocketHandler customWebSocketHandler;public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) {webSocketHandlerRegistry.addHandler(customWebSocketHandler, "/socket").setAllowedOrigins("*").withSockJS().setHeartbeatTime(20);}}

I'm having trouble with SockJs and CORS. I use spring. I set up the WebMvcConfigured as follows:

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

and WebSocketConfig as follows:

    @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();
}

However, when my web client tries to GET against /gs-guide-websocket/info , it gets a 404.

SockJs's specification requires a /info path to be present. It seems like even though I did use .withSockJS() on the server side, it did not set up the /gs-guide-websocket/info path.

How should I create this path through spring and/or spring-websocket?

Thank you,

Kevin

解决方案

I am not using the STOMP protocol, whereas I have configured the websocket with SockJS which is working fine for me.

Here the message payload has sent as response to the frontend.

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 进行故障排除和解决的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆