gpt4 book ai didi

spring - WebSocket 握手期间出错 : Unexpected response code: 400 when using Spring Websocket, Stomp,Openshift 中的 SockJS

转载 作者:行者123 更新时间:2023-12-05 06:41:12 24 4
gpt4 key购买 nike

到目前为止,根据我在互联网上搜索时了解到的情况,openshift 仅提供端口 8000 用于通过 HTTP 打开 Web 套接字连接。

我无法弄清楚的是如何使用 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 服务器端配置:

@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

请帮我解决这个错误。

最佳答案

我遇到了同样的问题,最后,经过很长时间我设法在 Openshift V3 中使用 Spring WebSocket,但我认为这个解决方案也适用于较旧的 Openshift V2。

唯一的妥协是不使用 SockJS,而是使用标准的 WebSocket API。

在您的情况下,您必须在方法 registerStompEndpoints remove .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 支持在同一端口上运行 WebSocket。当服务通过路由公开时,对于包括 WebSockets 在内的 HTTP 流量,这将是外部端口 80。

就是这样!

关于spring - WebSocket 握手期间出错 : Unexpected response code: 400 when using Spring Websocket, Stomp,Openshift 中的 SockJS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41156055/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com