Spring上的STOMP超过SockJS和Tomcat没有升级到Websockets

时间:2016-04-06 10:46:22

标签: java spring tomcat spring-websocket sockjs

我正在构建一个无状态Spring(4.2.4.RELEASE)解决方案,使用带有SockJS的Websockets上的STOMP和使用JWT通过全双工通信连接移动设备的Rest端点。我使用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
        {

        }
    }

2 个答案:

答案 0 :(得分:0)

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

此外,请检查您的浏览器是否支持Websocket。

答案 1 :(得分:0)

我解决了我的问题,实际上代码很好但是防病毒(卡巴斯基)刚刚打开后关闭了我的客户端浏览器上的连接。它迫使SockJS回归到另一种策略。我关闭了防病毒测试客户端,Websocket传输运行良好。测试了mac& linux以及。