Skip to content

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 消息。如果连接了却一直不说话,服务器会主动断开,防止空连接攻击。

Based on Spring Framework.