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

Jetty 8.x嵌入式服务添加会话时触发IllegalStateException: No SessionManager

解决Jetty 8.1.x嵌入式服务器的IllegalStateException: No SessionManager异常

这个问题我太熟悉了——嵌入式Jetty默认不会自动配置会话管理组件,尤其是当你手动构建处理器链而不是使用WebAppContext这类封装好的上下文时,调用request.getSession(true)就会触发这个异常。下面给你两种靠谱的解决方式,都是Jetty 8.1版本兼容的:

方式一:手动构建SessionHandler + SessionManager链

如果你是自己组装Handler(比如用ServletHandler或者自定义Handler),需要把会话管理组件加入到处理器链的最上层:

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.session.HashSessionManager;
import org.eclipse.jetty.server.session.SessionHandler;
import org.eclipse.jetty.servlet.ServletHandler;

public class JettyServer {
    public static void main(String[] args) throws Exception {
        Server server = new Server(8080);

        // 1. 创建会话管理器,Jetty 8默认用HashSessionManager
        HashSessionManager sessionManager = new HashSessionManager();
        // 可选:设置会话超时时间(秒)
        sessionManager.setMaxInactiveInterval(3600);

        // 2. 创建会话处理器,关联会话管理器
        SessionHandler sessionHandler = new SessionHandler(sessionManager);

        // 3. 把你原来的业务处理器(比如ServletHandler)设置为sessionHandler的子处理器
        ServletHandler servletHandler = new ServletHandler();
        // 这里添加你的Servlet映射,比如:
        servletHandler.addServletWithMapping(YourSessionAwareServlet.class, "/api/*");

        sessionHandler.setHandler(servletHandler);

        // 4. 将sessionHandler设置为服务器的根处理器
        server.setHandler(sessionHandler);

        server.start();
        server.join();
    }
}

方式二:使用ServletContextHandler并启用会话支持

如果你用的是ServletContextHandler,可以直接通过构造参数启用会话支持,它会自动帮你初始化SessionManager和SessionHandler,更省心:

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;

public class JettyServer {
    public static void main(String[] args) throws Exception {
        Server server = new Server(8080);

        // 使用SESSIONS参数启用会话支持
        ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
        context.setContextPath("/");

        // 添加你的Servlet映射
        context.addServlet(YourSessionAwareServlet.class, "/api/*");

        server.setHandler(context);

        server.start();
        server.join();
    }
}

关键原因说明

之前你的应用运行正常是因为没用到会话功能,Jetty不会自动加载会话管理组件。当你调用request.getSession(true)时,Jetty需要创建会话,但找不到对应的SessionManager,就会抛出这个异常。只要把SessionHandler加入到处理器链的顶层,确保所有请求先经过会话处理器,问题就解决了。

内容的提问来源于stack exchange,提问作者Kettch19

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:13:28