Jetty持久会话 - 只写?

时间:2012-05-02 03:42:55

标签: 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 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中没有记录,所以除了挖掘源代码以找到潜在的错误之外,很难知道从这里去哪里...

1 个答案:

答案 0 :(得分:0)

一天后回答我自己的问题。我尝试在会话中添加一个自定义键值对,并发现它持久存在于会话中。在这样做的同时,我还注意到会话文件的大小正在稳步增长,如果整个会话似乎每次重新启动时都被清除,这似乎特别不寻常!

所以我编写了一些代码来转储所有的会话数据,并发现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名称。

修复程序当然是为调度程序servlet设置已知名称的单行程序。