You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 00:00:17