Java Jetty持久会话-仅写?
我一直在努力让Jetty的会话持久性发挥作用。它实际上是在将会话写入磁盘,但似乎并没有将它们读回,因为当我的应用程序有机会读取会话时,我的会话数据已经全部被删除 我们这样配置它:Java Jetty持久会话-仅写?,java,session,persistence,jetty,wicket,Java,Session,Persistence,Jetty,Wicket,我一直在努力让Jetty的会话持久性发挥作用。它实际上是在将会话写入磁盘,但似乎并没有将它们读回,因为当我的应用程序有机会读取会话时,我的会话数据已经全部被删除 我们这样配置它: HashSessionManager sessionManager = new HashSessionManager(); sessionManager.setStoreDirectory(new File("sessions")); // If I don't put in this next line, it s
HashSessionManager sessionManager = new HashSessionManager();
sessionManager.setStoreDirectory(new File("sessions"));
// If I don't put in this next line, it seems like it "never" saves sessions to disk.
// Or at least I don't have the patience to wait however long it must take to do so.
sessionManager.setSavePeriod(5);//seconds
// Supposedly if you don't turn this on it can cause problems for some of the things
// Wicket puts in the session because Jetty would otherwise initialise the objects in
// the session before Wicket itself initialises.
sessionManager.setLazyLoad(true);
// ...
servletHandler.setSessionHandler(new SessionHandler(sessionManager));
文档中似乎没有提到任何明显的缺陷,除了我在上面的代码中通过启用延迟加载已经提到的缺陷。但是这个类中还有很多其他的会话,而且几乎所有的会话都没有在Javadoc中记录,所以很难知道从这里可以走到哪里,除了通过挖掘它们的源代码来找到潜在的bug…一天后回答我自己的问题。我尝试向会话中添加自定义键值对,发现它被持久化到会话中。在这样做的同时,我还注意到会话文件的大小在稳步增长,如果每次服务器重新启动时整个会话似乎都被清除,这似乎特别不寻常 因此,我编写了一些代码来转储所有会话数据,发现Wicket在会话中有多个值,就像这样,到目前为止,只有大约10倍多的键值对: Wicket:SessionUnbindingListener-com.acme.server.web.DispatcherServlet-1037224009=org.apache.wicket.session.HttpSessionStore$SessionBindingListener@5b3ab386 Wicket:SessionUnbindingListener-com.acme.server.web.DispatcherServlet-1306414591=org.apache.wicket.session.HttpSessionStore$SessionBindingListener@33048394 wibble=wobble wicket:com.acme.server.web.DispatcherServlet-1037224009:session=com.acme.server.webui.ServerWebUISession@30e97557 wicket:com.acme.server.web.DispatcherServlet-1037224009:wicket:persistentPageManagerData - com.acme.server.web.DispatcherServlet-1037224009=org.apache.wicket.page.PageStoreManager$SessionEntry@20e39570 wicket:com.acme.server.web.DispatcherServlet-1306414591:currentUser=com.acme.server.auth.DefaultServerUser@2f16bbd7[id=2,name=admin,roles=[admin, user]] wicket:com.acme.server.web.DispatcherServlet-1306414591:roles=admin, user wicket:com.acme.server.web.DispatcherServlet-1306414591:session=com.acme.server.webui.ServerWebUISession@6b8cb5cd wicket:com.acme.server.web.DispatcherServlet-1306414591:wicket:persistentPageManagerData - com.acme.server.web.DispatcherServlet-1306414591=org.apache.wicket.page.PageStoreManager$SessionEntry@517d59d0 这让我开始疯狂地搜索com.acme.server.web.DispatcherServlet-1037224009。它原来是servlet的getServletName的值。getServletName的Javadoc表示servlet名称将是servlet的类名,但对于Jetty来说,事实并非如此——它还在末尾附加了某种随机数。因此,这是Jetty+Wicket的一个特性,Wicket将servlet名称放入会话密钥中,然后Jetty不会根据API文档生成servlet名称
修复程序当然是为dispatcher servlet设置一个已知名称的一行程序。一天后回答了我自己的问题。我尝试向会话中添加自定义键值对,发现它被持久化到会话中。在这样做的同时,我还注意到会话文件的大小在稳步增长,如果每次服务器重新启动时整个会话似乎都被清除,这似乎特别不寻常 因此,我编写了一些代码来转储所有会话数据,发现Wicket在会话中有多个值,就像这样,到目前为止,只有大约10倍多的键值对: Wicket:SessionUnbindingListener-com.acme.server.web.DispatcherServlet-1037224009=org.apache.wicket.session.HttpSessionStore$SessionBindingListener@5b3ab386 Wicket:SessionUnbindingListener-com.acme.server.web.DispatcherServlet-1306414591=org.apache.wicket.session.HttpSessionStore$SessionBindingListener@33048394 wibble=wobble wicket:com.acme.server.web.DispatcherServlet-1037224009:session=com.acme.server.webui.ServerWebUISession@30e97557 wicket:com.acme.server.web.DispatcherServlet-1037224009:wicket:persistentPageManagerData - com.acme.server.web.DispatcherServlet-1037224009=org.apache.wicket.page.PageStoreManager$SessionEntry@20e39570 wicket:com.acme.server.web.DispatcherServlet-1306414591:currentUser=com.acme.server.auth.DefaultServerUser@2f16bbd7[id=2,name=admin,roles=[admin, user]] wicket:com.acme.server.web.DispatcherServlet-1306414591:roles=admin, user wicket:com.acme.server.web.DispatcherServlet-1306414591:session=com.acme.server.webui.ServerWebUISession@6b8cb5cd wicket:com.acme.server.web.DispatcherServlet-1306414591:wicket:persistentPageManagerData - com.acme.server.web.DispatcherServlet-1306414591=org.apache.wicket.page.PageStoreManager$SessionEntry@517d59d0 这让我开始疯狂地搜索com.acme.server.web.DispatcherServlet-1037224009。它原来是servlet的getServletName的值。getServletName的Javadoc表示servlet名称将是servlet的类名,但对于Jetty来说,事实并非如此——它还在末尾附加了某种随机数。因此,这是Jetty+Wicket的一个特性,Wicket将servlet名称放入会话密钥中,然后Jetty不会根据API文档生成servlet名称
修复程序当然是为dispatcher servlet设置一个已知名称的一行程序。Wicket在键中使用filter/servlet名称,因为您可能在一个.war中有多个Wicket应用程序。就像wicket-examples.战争一样。我无法评论Jetty部分。Wicket在键中使用过滤器/servlet名称,因为您可能在一个.war中有多个Wicket应用程序。就像wicket-examples.战争一样。我不能评论码头部分。