嵌入式 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 应用程序,这会很好。
我正在我的 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 应用程序,这会很好。