WebSocket握手期间出现错误:意外的响应代码:400在Openshift中使用Spring Websocket,Stomp和SockJS
问题描述:
从我迄今为止在互联网搜索中学到的内容来看,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();
}
}
如果我尝试这种方式,
var socket = new SockJS('/portal/ws');
错误我得到的是,
请帮我解决这个错误。
答
我有同样的问题,最后,经过很长时间,我设法在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。
就这样!
你解决了这个问题吗?如果可以,请分享您的答案? – Debopam