嵌入式 Jetty:如何在没有 ServletContextListener 的情况下调用 setSessionTrackingModes

Embedded Jetty: How do I call setSessionTrackingModes without a ServletContextListener

我正在我的 main 中连接一个嵌入式 Jetty 服务器,我只想强制将 cookie 作为会话跟踪模式。

所以我尝试这样做:

//in main
ServletContextHandler contextHandler = 
    new ServletContextHandler(ServletContextHandler.SESSIONS);

contextHandler
    .getServletContext()
    .setSessionTrackingModes(EnumSet.of(SessionTrackingMode.COOKIE));

但我得到以下信息:

Exception in thread "main" java.lang.IllegalStateException
at org.eclipse.jetty.servlet.ServletContextHandler$Context.setSessionTrackingModes(ServletContextHandler.java:1394)

我的 servlet 上下文尚未初始化。

显而易见的解决方案是在 ServletContextListener 中执行此操作,但我宁愿不这样做。我希望所有接线和设置都集中在一个中心位置,而不使用监听器。

有办法吗?

异常的原因是ServletContext还不存在(你的服务器还没有启动)。

但是有两种方法可以做到这一点。

技术 1) 显式会话管理:

    Server server = new Server(8080);

    // Specify the Session ID Manager
    HashSessionIdManager idmanager = new HashSessionIdManager();
    server.setSessionIdManager(idmanager);

    // Create the SessionHandler to handle the sessions
    HashSessionManager manager = new HashSessionManager();
    manager.setSessionTrackingModes(EnumSet.of(SessionTrackingMode.COOKIE)); // <-- here
    SessionHandler sessions = new SessionHandler(manager);

    // Create ServletContext
    ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
    context.setSessionHandler(sessions); // <-- set session handling
    server.setHandler(context);

对于嵌入式码头,这可能是更合适的方法,因为您现在可以控制会话的整个创建/存储/行为。

技术 2) 使用默认值,配置 HashSessionManager:

    Server server = new Server(8080);

    // Create ServletContext
    ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
    context.getSessionHandler()
           .getSessionManager()
           .setSessionTrackingModes(EnumSet.of(SessionTrackingMode.COOKIE));
    server.setHandler(context);

对于简单的 Web 应用程序,这会很好。