如何在Spring 5.3.37+Jetty10环境配置WebSocket会话空闲超时?
解决方案
针对Spring 5.3.37 + 嵌入式Jetty 10的WebSocket空闲超时配置问题,无需升级版本或依赖ping机制,可通过配置Jetty原生WebSocket ServerContainer实现超时延长,具体有两种可行方式:
方式一:在嵌入式Jetty启动时直接配置
在初始化Jetty Server的代码中,通过WebSocketServerContainerInitializer配置默认会话空闲超时:
// 初始化Jetty Server Server jettyServer = new Server(); HttpConnector connector = new HttpConnector(); connector.setPort(8080); jettyServer.addConnector(connector); // 配置Servlet上下文 ServletContextHandler contextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS); contextHandler.setContextPath("/"); jettyServer.setHandler(contextHandler); // 配置WebSocket容器超时 WebSocketServerContainerInitializer.configure(contextHandler, (servletContext, container) -> { // 设置空闲超时时间,单位:毫秒,示例为30分钟 container.setDefaultMaxSessionIdleTimeout(30 * 60 * 1000); }); // 注册Spring DispatcherServlet(原有代码保持不变) DispatcherServlet dispatcherServlet = new DispatcherServlet(new AnnotationConfigWebApplicationContext(WSConfig.class)); contextHandler.addServlet(new ServletHolder(dispatcherServlet), "/*"); // 启动Jetty jettyServer.start();
方式二:通过Spring的ServletContextInitializer Bean配置
如果你的应用是通过Spring管理Web上下文,可添加一个ServletContextInitializer Bean来初始化Jetty的WebSocket容器:
@Configuration @EnableWebSocket public class WSConfig implements WebSocketConfigurer { private final WSNotifyHandler wsNotifyHandler; public WSConfig(WSNotifyHandler wsNotifyHandler) { this.wsNotifyHandler = wsNotifyHandler; } @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(wsNotifyHandler, "/ws") .addInterceptors(new HttpSessionHandshakeInterceptor()) .setHandshakeHandler(handshakeHandler()); } @Bean public DefaultHandshakeHandler handshakeHandler() { return new DefaultHandshakeHandler(new Jetty10RequestUpgradeStrategy()); } // 添加WebSocket容器配置Bean @Bean public ServletContextInitializer jettyWebSocketInitializer() { return servletContext -> { WebSocketServerContainerInitializer.configure(servletContext, (context, container) -> { // 设置空闲超时时间,单位:毫秒 container.setDefaultMaxSessionIdleTimeout(30 * 60 * 1000); }); }; } }
原理说明
Jetty10RequestUpgradeStrategy本质上是基于Jetty原生的WebSocket ServerContainer实现升级逻辑,Spring会复用ServletContext中初始化好的ServerContainer实例。通过WebSocketServerContainerInitializer配置容器的defaultMaxSessionIdleTimeout属性,就能全局生效所有WebSocket会话的空闲超时时间。
内容的提问来源于stack exchange,提问作者VirtualVoid
相关产品推荐
相关产品推荐

