Spring STOMP Websockets:在服务器端启用permessage-deflate的任何方法?

时间:2016-02-11 18:20:02

标签: spring spring-websocket

我使用spring-boot-starter 1.3.1.RELEASE与Jetty后端一起使用spring-websockets。我想知道如何在服务器中启用permessage-deflate。

我有一个客户端托管在一个愿意协商压缩的Firefox版本上,即对WebSocket端点的初始握手包括压缩协商头,如:

GET https://my-websocket-host/my-endpoint
...
Sec-WebSocket-Protocol: v10.stomp,v11.stomp
Sec-WebSocket-Extensions: permessage-deflate
Sec-WebSocket-Key: ...
...

,但服务器响应在升级响应中不包含permessage-deflate扩展头,这意味着它不愿意协商压缩。我已经进行了一次寻宝活动,寻找可以在配置中启用但未找到任何内容的地方。我可以使用一些API来启用此功能,还是当前产品不支持?

非常感谢,

史蒂夫

1 个答案:

答案 0 :(得分:3)

此功能需要在Jetty中启用,因为我认为默认情况下不会注册此扩展。 Spring提供了一种配置握手处理程序并启用该扩展的方法。

原则在the reference documentation on websocket server configuration中解释,但这是一个完整的例子:

@Configuration
@EnableWebSocket
public class SampleJettyWebSocketsApplication implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        // make sure to use the handshake handler we've defined
        registry.addHandler(echoWebSocketHandler(), "/echo")
                .setHandshakeHandler(handshakeHandler()).withSockJS();
    }

    @Bean
    public DefaultHandshakeHandler handshakeHandler() {

        WebSocketServerFactory factory = new WebSocketServerFactory();
        // add the "permessage-compress" Websocket extension
        factory.getExtensionFactory()
               .register("permessage-compress", PerMessageDeflateExtension.class);
        return new DefaultHandshakeHandler(new JettyRequestUpgradeStrategy(factory));
    }