升级到 jetty 9.4 替换 HashSessionManager

Upgrading to jetty 9.4 replacing the HashSessionManager

升级到 jetty 9.4 后,我注意到 org.eclipse.jetty.server.session.HashSessionManager 的 ClassNotFoundException。 我想我需要使用 FileSessionDataStore 但我不明白应该如何在 SessionHandler 上设置。

我目前的配置是:

<Configure class="org.eclipse.jetty.webapp.WebAppContext">
    ...
    <Set name="sessionHandler">
        <New class="org.eclipse.jetty.server.session.SessionHandler">
            <Arg> 
                <New class="org.eclipse.jetty.server.session.HashSessionManager">
                    <Set name="storeDirectory">my/store/path</Set>
                </New>
            </Arg>
        </New>
    </Set>
</Configure>

我不明白我需要做什么,SessionHandler 不带 SessionDataStore,但可以在其上设置 SessionCache 但它看起来像实现SessionCache 的人想要在构造函数中使用 SessionHandler,我在 XML 中看不到如何做到这一点。

啊,我想我已经解决了,结果不太好:

<Set name="sessionHandler">
    <New class="org.eclipse.jetty.server.session.SessionHandler">
    </New>
</Set>

<Call name="getSessionHandler" id="sessionHandler" />

<Ref refid="sessionHandler">
    <Set name="SessionCache">    
        <New class="org.eclipse.jetty.server.session.DefaultSessionCache">
            <Arg>
                <Ref refid="sessionHandler"/>
            </Arg>
            <Set name="SessionDataStore">
                <New class="org.eclipse.jetty.server.session.FileSessionDataStore">
                        <Set name="StoreDir">my/store/path</Set>
                </New>
            </Set>
        </New>
    </Set>
</Ref>

我遵循了在 http://useof.org/java-open-source/org.eclipse.jetty.server.session.FileSessionDataStore

中找到的更易于阅读的纯 java 示例

如果 Jetty 专家认为这不正确,我很乐意编辑答案以免误导他人。

在 jetty-9.4 会话架构中,您有 SessionHandler 需要一个 SessionCache,它可以选择需要一个 SessionDataStore

有关编程示例,请参阅 OneServletContextWithSession

该示例使用了 NullSessionDataStore,但原理与 FileSessionDataStore 相同,后者替代了旧的 HashSessionManager 将会话存储到磁盘的能力。

Jetty 文档包含信息 on changes from previous versions of Jetty session management to the 9.4 style

如果您点击文档中的链接,您还将找到有关新会话架构的详细信息。

正如文档所解释的那样,在发行版中 运行 时,在 jetty-9.4 中配置会话的最简单方法是启用适当的模块。但是,如果您是 运行 嵌入式,或者您只想为 xml 中的特定 Web 应用程序设置会话管理,这里有一些设置 FileSessionDataStore 的示例代码:

<Get id="sh" name="sessionHandler">
    <Set name="sessionCache">
        <New class="org.eclipse.jetty.server.session.DefaultSessionCache">
          <Arg><Ref id="sh"/></Arg>
          <Set name="sessionDataStore">
            <New class="org.eclipse.jetty.server.session.FileSessionDataStore">
              <Set name="storeDir">/tmp/sessions</Set>
            </New>
          </Set>
        </New>
    </Set>
</Get>