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
相关产品推荐
相关产品推荐

