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

时间:2015-06-25 09:34:33

标签: servlets jetty embedded-jetty servlet-3.0

我在我的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中执行此操作,但我宁愿不这样做。我希望所有的布线和设置都保留在一个中心位置,而不使用Listener。

有办法吗?

1 个答案:

答案 0 :(得分:2)

例外的原因是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);

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

技术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);

对于简单的网络应用,这可以正常工作。