【问题标题】:Embedded Jetty: How do I call setSessionTrackingModes without a ServletContextListenerEmbedded Jetty:如何在没有 ServletContextListener 的情况下调用 setSessionTrackingModes
【发布时间】:2015-09-11 19:57:51
【问题描述】:

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

有办法吗?

【问题讨论】:

  • 什么版本的 Jetty?
  • @JoakimErdfelt 9.3.0.M2 及以上

标签: servlets jetty embedded-jetty servlet-3.0


【解决方案1】:

异常的原因是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);

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

【讨论】:

  • 我明白了,所以基本上直接通过会话管理器设置跟踪模式,而不是通过 servlet 上下文。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多