2016-12-15 3 views
2

Из того, что я узнал до сих пор при поиске через Интернет, openshift предоставляет только порт 8000 для открытия соединения через сокет через HTTP.Ошибка во время рукопожатия WebSocket: Неожиданный код ответа: 400 при использовании Spring Websocket, Stomp, SockJS в Openshift

Что я не могу понять, так это как заставить его работать с Spring WebSocket с помощью Stomp и SockJs. Вот мой фрагмент кода,

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 ServerSide 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

У меня была такая же проблема, и, наконец, после долгого времени мне удалось использовать Spring WebSocket в Openshift V3, но я думаю, что это решение работает и в более раннем Openshift V2.

Единственный компромисс заключается в том, чтобы не использовать SockJS, а стандартный API WebSocket.

В вашем случае вы должны в методе 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 за тот же порт. Когда услуга открывается через маршрут, это будет внешний порт 80 для HTTP-трафика, включая WebSockets.

Вот и все!

Смежные вопросы

 Смежные вопросы