带有SockJs的Spring Websocket从XHR流转换到Websocket

时间:2016-12-29 12:47:52

标签: spring websocket stomp spring-websocket sockjs

我在客户端上使用Spring Websocket和SockJs(v1.1.1)而不是STOMP。我使用下面的代码创建客户端。

SockJS = require('sockjs-client')
Stomp = require('webstomp-client')
stompClient = Stomp.over(new SockJS(url))

它的工作正常。但它默认使用xhr_streaming作为传输,这对我来说是不可取的。我想将其切换为websocket tranport。

stompClient = Stomp.over(new SockJS(url, null, {transports:'websocket'}))

但这种方法对我不起作用。它与事件有关:

code: 2000
reason: "All transports failed"

My Spring Websocket配置非常简单:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractSessionWebSocketMessageBrokerConfigurer<ExpiringSession> {

    @Override
    public void configureStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/myEndpoint").setAllowedOrigins("*")
            .withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/queue/", "/topic/");
        registry.setApplicationDestinationPrefixes("/app");
    }

}

我面对xhr_streaming的主要问题是每个流请求都会更新用户会话的上次访问时间(我也使用Spring Session)。但它对我的应用程序来说并不是一个理想的行为。那么我该如何解决呢?并且websocket会有运输帮助吗?提前谢谢。

1 个答案:

答案 0 :(得分:2)

所以,我有理由。我正在使用带有proxy选项的webpack dev服务器。默认情况下,它不代理ws协议请求(它丢失了标头)。您需要在配置中添加ws: true,一切都会正常运行。

proxy: {
        '/api/*': {
            target: 'http://localhost:8080',
            pathRewrite: {'^/api' : ''},
            ws: true 
        }
    }