2016-12-15 168 views
2

从我迄今为止在互联网搜索中学到的内容来看,openshift仅提供用于通过HTTP打开web套接字连接的端口8000。WebSocket握手期间出现错误:意外的响应代码:400在Openshift中使用Spring Websocket,Stomp和SockJS

我无法弄清楚的是,如何使它与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的服务器端CONFIGRATION:

@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

请帮我解决这个错误。

+0

你解决了这个问题吗?如果可以,请分享您的答案? – Debopam

回答

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,并使用新路径连接到端点。您可以看到我使用的端口80:OpenShift V3支持通过同一端口运行WebSockets。当服务通过路由暴露时,对于包括WebSockets的HTTP流量,这将是外部端口80。

就这样!