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

WebSocket握手期间出错:在Openshift中使用Spring WebSocket、Stomp、SockJS时出现意外响应代码:400,spring,websocket,openshift,stomp,sockjs,Spring,Websocket,Openshift,Stomp,Sockjs,从我在互联网上搜索到的信息来看,openshift只提供了8000端口,用于通过HTTP打开web套接字连接 我无法弄清楚的是,如何使用Stomp和SockJs实现SpringWebSocket。这是我的代码片段 Websocket客户端实现: function connect() { var socket = new SockJS('http://jbossews-nabac.rhcloud.com:8000/portal/ws'); stompClient =

从我在互联网上搜索到的信息来看,openshift只提供了8000端口,用于通过HTTP打开web套接字连接

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

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

}

如果我这样做

var socket = new SockJS('/portal/ws');
我得到的错误是


请帮助我修复此错误。

我也遇到了同样的问题,经过很长时间后,我终于在Openshift V3中使用了Spring WebSocket,但我认为此解决方案在较旧的Openshift V2中也可以使用

唯一的折衷办法是不使用SockJS,而是使用标准的websocketapi

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

如前所述,在客户端中,您必须使用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支持在同一端口上运行WebSocket。当服务通过路由公开时,该路由将是外部用于HTTP通信(包括WebSocket)的端口80


就这些

你解决这个问题了吗?如果是,请分享你的答案好吗?
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);
        });
    });
}