我在我的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。
有办法吗?
答案 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);
对于简单的网络应用,这可以正常工作。