2016-12-15 136 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。

就這樣!

相關問題