2

我一直试图让 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 中记录,因此除了挖掘其源代码以查找潜在错误之外,很难知道从这里去哪里......

4

1 回答 1

0

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

所以我写了一些代码来转储所有的会话数据,并发现 Wicket 在会话中有多个像这样的值(到现在为止,只有大约 10 倍的键值对):

检票口:SessionUnbindingListener-com.acme.server.web.DispatcherServlet-1037224009=org.apache.wicket.session.HttpSessionStore$SessionBindingListener@5b3ab386
检票口:SessionUnbindingListener-com.acme.server.web.DispatcherServlet-1306414591=org.apache.wicket.session.HttpSessionStore$SessionBindingListener@33048394
摆动=摆动
检票口: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,用户
检票口: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 设置已知名称的单行程序。

于 2012-05-03T04:56:07.923 回答