Spring with STOMP over SockJS 和 Tomcat 未升级到 Websockets

Posted

技术标签:

【中文标题】Spring with STOMP over SockJS 和 Tomcat 未升级到 Websockets【英文标题】:Spring with STOMP over SockJS and Tomcat not upgrading to Websockets 【发布时间】:2016-07-26 17:13:47 【问题描述】:

我正在构建一个无状态 Spring (4.2.4.RELEASE) 解决方案,使用 STOMP over Websockets 和 SockJS 和一个使用 JWT 的 Rest Endpoint 来连接具有全双工通信的移动设备。我使用 Tomcat 8.0.33 作为 Web 服务器并使用带有 sockjs javascript 客户端的 html 进行测试。 stomp 协议使用 http 后备可以正常工作,但我不能只使用 websocket 协议。我以多种方式尝试了 CORS,但我不确定这是 Tomcat 问题还是弹簧配置不好。即使在相同的域和端口中,我也测试了我的 html,而 SockJS 仍然退回到 xhr 或 iframe。

WebScoketConfig.java

@EnableWebSocketMessageBroker
 public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer


@Override
public void registerStompEndpoints(StompEndpointRegistry registry)

    RequestUpgradeStrategy upgradeStrategy = new TomcatRequestUpgradeStrategy();
    registry.addEndpoint("/ws").setHandshakeHandler(new DefaultHandshakeHandler(upgradeStrategy))
    .setAllowedOrigins("*").withSockJS().setSessionCookieNeeded(false)
    .setStreamBytesLimit(512 * 1024)
    .setHttpMessageCacheSize(1000)
    .setDisconnectDelay(30 * 1000);


@Override
public void configureClientOutboundChannel(ChannelRegistration registration) 
    registration.taskExecutor().corePoolSize(50);



@Override
public void configureMessageBroker(MessageBrokerRegistry registry)

    registry.enableSimpleBroker("/queue/", "/topic/");
    // registry.enableStompBrokerRelay("/queue/", "/topic/");
    registry.setApplicationDestinationPrefixes("/myapp");


 public void configureWebSocketTransport(WebSocketTransportRegistration registration) 
    registration.setMessageSizeLimit(500 * 1024);
    registration.setSendBufferSizeLimit(1024 * 1024);
    registration.setSendTimeLimit(20000);
 

WebSecurityConfig.java

    public class WebSecurityConfig extends WebSecurityConfigurerAdapter
    

        @Override
        protected void configure(HttpSecurity http) throws Exception
        
            http.csrf().disable()
            .authorizeRequests()
            .antMatchers("/**").permitAll();                
        

        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception
        

        
    

【问题讨论】:

【参考方案1】:

我解决了我的问题,实际上代码很好,但是杀毒软件(卡巴斯基)在打开我的客户端浏览器后就关闭了连接。它迫使 SockJS 退回到不同的策略。我在关闭防病毒软件的情况下测试了客户端,并且 Websocket 传输运行良好。也在 mac 和 linux 上测试过。

【讨论】:

【参考方案2】:

Tomcat 从版本 8 开始支持 Websocket。检查您的 Tomcat 版本并升级。

进一步检查您的浏览器是否支持 Websocket。

【讨论】:

我使用的是最新的 Tomcat 版本。它支持 websockets。

以上是关于Spring with STOMP over SockJS 和 Tomcat 未升级到 Websockets的主要内容,如果未能解决你的问题,请参考以下文章

Spring STOMP over Websocket - “私人”消息传递

SockJS over stomp 使用 angular2 和 spring boot

Spring Boot + Stomp over WS 与嵌入式 Artemis 代理“目标不存在”

STOMP over websockets 与普通 STOMP。哪一个更好?

Spring Security with LDAP over SSL:需要更多细节

RabbitMQ Stomp over websocket:无法检索排队的消息