WebSocket 传输
本节解释如何配置底层的 WebSocket 服务器传输。
对于 Jakarta WebSocket 服务器,请在配置中添加 ServletServerContainerFactoryBean。示例请参阅 WebSocket 章节下的配置服务器。
对于 Jetty WebSocket 服务器,请按如下方式自定义 JettyRequestUpgradeStrategy:
java
@Configuration
@EnableWebSocketMessageBroker
public class JettyWebSocketConfiguration implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/portfolio").setHandshakeHandler(handshakeHandler());
}
@Bean
public DefaultHandshakeHandler handshakeHandler() {
JettyRequestUpgradeStrategy strategy = new JettyRequestUpgradeStrategy();
strategy.addWebSocketConfigurer(configurable -> {
configurable.setInputBufferSize(4 * 8192);
configurable.setIdleTimeout(Duration.ofSeconds(600));
});
return new DefaultHandshakeHandler(strategy);
}
}kotlin
@Configuration
@EnableWebSocketMessageBroker
class JettyWebSocketConfiguration : WebSocketMessageBrokerConfigurer {
override fun registerStompEndpoints(registry: StompEndpointRegistry) {
registry.addEndpoint("/portfolio").setHandshakeHandler(handshakeHandler())
}
@Bean
fun handshakeHandler(): DefaultHandshakeHandler {
val strategy = JettyRequestUpgradeStrategy()
strategy.addWebSocketConfigurer {
it.inputBufferSize = 4 * 8192
it.idleTimeout = Duration.ofSeconds(600)
}
return DefaultHandshakeHandler(strategy)
}
}除了 WebSocket 服务器属性外,还可以按如下方式自定义 STOMP WebSocket 传输属性:
java
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration implements WebSocketMessageBrokerConfigurer {
@Override
public void configureWebSocketTransport(WebSocketTransportRegistration registry) {
registry.setMessageSizeLimit(4 * 8192);
registry.setTimeToFirstMessage(30000);
}
}kotlin
@Configuration
@EnableWebSocketMessageBroker
class WebSocketConfiguration : WebSocketMessageBrokerConfigurer {
override fun configureWebSocketTransport(registry: WebSocketTransportRegistration) {
registry.setMessageSizeLimit(4 * 8192)
registry.setTimeToFirstMessage(30000)
}
}补充教学
1. 为什么需要限制消息大小?
WebSocket 虽然支持长连接,但并不是为了传输超大文件设计的。配置 setMessageSizeLimit 可以防止恶意客户端发送巨大的消息负载从而撑爆服务器内存。默认通常是 64KB,在需要传输复杂 JSON 内容时,可以适当调大。
2. 空闲超时 (Idle Timeout)
WebSocket 是一项长连接技术,如果不设置超时,失效的孤立连接会白白占用服务器资源。setIdleTimeout 允许你定义在多长时间没有数据往来后自动关闭连接。
3. 首条消息时间限制 (TimeToFirstMessage)
这是一个安全增强项。它限制了在 TCP 连接建立后,客户端必须在多长时间内发送第一条 STOMP 消息。如果连接了却一直不说话,服务器会主动断开,防止空连接攻击。