WebSocket握手期间出错:在Openshift中使用Spring Websocket,Stomp,SockJS时出现意外响应代码:400

问题描述 投票:2回答:1

根据我在互联网上搜索到目前为止所学到的知识,openshift仅提供了端口8000,用于通过HTTP打开Web套接字连接。

我无法弄清楚的是如何使用Stomp和SockJs实现Spring WebSocket实现。这是我的代码片段,

Websocket客户端实现:

function connect() {
        var socket = new SockJS('http://jbossews-nabac.rhcloud.com:8000/portal/ws');
        stompClient = Stomp.over(socket);
        stompClient.connect({}, function(frame) {
            setConnected(true);
            console.log('Connected: ' + frame);
            stompClient.subscribe('/queue/reply/${pageContext.session.id}', function(greeting) {
                showGreeting(greeting.body);
            });
        });
    }

WebSocket服务器端配置:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketDefaultConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic/", "/queue/");
        config.setApplicationDestinationPrefixes("/portal");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws")
        .withSockJS()
        .setInterceptors(httpSessionIdHandshakeInterceptor());
    }

    @Bean
    public HttpSessionIdHandshakeInterceptor httpSessionIdHandshakeInterceptor() {
        return new HttpSessionIdHandshakeInterceptor();
    }

}

Chrome Console

如果我这样试试,

var socket = new SockJS('/portal/ws');

我得到的错误是,

Chrome Console

请帮我修复此错误。

spring websocket openshift stomp sockjs
1个回答
0
投票

我有同样的问题,最后,经过很长一段时间我设法在Openshift V3中使用Spring WebSocket,但我认为这个解决方案也适用于较旧的Openshift V2。

唯一的妥协是不使用SockJS,而是使用标准的WebSocket API。

在您的情况下,您必须在方法registerStompEndpoints中删除.withSockJS(),编辑添加后缀“/ websocket”的端点路径并将允许的原点设置为“*”(可能后者不是必需的)。

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketDefaultConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic/", "/queue/");
        config.setApplicationDestinationPrefixes("/portal");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws/websocket")
        .setAllowedOrigins(‌​"*")
        .setInterceptors(httpSessionIdHandshakeInterceptor());
    }

    @Bean
    public HttpSessionIdHandshakeInterceptor httpSessionIdHandshakeInterceptor() {
        return new HttpSessionIdHandshakeInterceptor();
    }
}

在客户端中,如上所述,您必须使用WebSocket API而不是SockJS,并使用新路径连接到端点。

function connect() {
    var socket = new WebSocket('ws://your_service_exposed_route:80/portal/ws/websocket');
    stompClient = Stomp.over(socket);
    stompClient.connect({}, function(frame) {
        setConnected(true);
        console.log('Connected: ' + frame);
        stompClient.subscribe('/queue/reply/${pageContext.session.id}', function(greeting) {
            showGreeting(greeting.body);
        });
    });
}

如您所见,我使用了端口80:OpenShift V3支持在同一端口上运行WebSockets。当通过路由公开服务时,对于包括WebSockets在内的HTTP流量,这将是外部端口80。

就这样!

© www.soinside.com 2019 - 2024. All rights reserved.