Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jetty持久会话-仅写?_Java_Session_Persistence_Jetty_Wicket - Fatal编程技术网

Java 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

我一直在努力让Jetty的会话持久性发挥作用。它实际上是在将会话写入磁盘,但似乎并没有将它们读回,因为当我的应用程序有机会读取会话时,我的会话数据已经全部被删除

我们这样配置它:

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.战争一样。我不能评论码头部分。