【问题标题】:Jetty persistent sessions - write-only?码头持久会话 - 只写?
【发布时间】:2012-05-02 03:42:55
【问题描述】:

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

【问题讨论】:

    标签: java session persistence jetty wicket


    【解决方案1】:

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

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

    【讨论】:

    • Wicket 在键中使用过滤器/servlet 名称,因为您可能在一个 .war 中拥有多个 wicket 应用程序。就像 wicket-examples.war 一样。我无法评论 Jetty 部分。
    猜你喜欢
    • 2012-11-20
    • 2012-03-17
    • 1970-01-01
    • 2017-04-16
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    相关资源
    最近更新 更多