为了拥有自定义 session 存储,我实现了自定义 sessionManager(通过扩展 NoSqlSessionManager
)和 sessionIdManager。我的代码(以及它所需的 jar)进入了 ${jetty.home}/lib/ext
(顺便说一句,版本 8.1.4)。在 start.ini
中,我包含了另一个包含以下内容的配置文件:
<Configure id="Server" class="org.eclipse.jetty.server.Server">
<Set name="sessionIdManager">
<New id="customIdMgr" class="com.me.customSessionIdManager">
<Arg>...</Arg>
</New>
</Set>
</Configure>
Jetty 启动并且 sessionIdManager 似乎正在工作。至少正在调用 scavenge() 方法。到目前为止,一切都很好。下一步是将我的自定义 sessionManager 与我选择的 WebAppContext 相关联。我在覆盖模板 (overlay.xml
) 中使用以下内容完成了此操作:
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<Get name="server">
<Get id="customIdMgr" name="sessionIdManager"/>
</Get>
<Set name="sessionHandler">
<New class="org.eclipse.jetty.server.session.SessionHandler">
<Arg>
<New class="com.me.customSessionManager">
<Set name="sessionIdManager"><Ref id="customIdMgr"/></Set>
</New>
</Arg>
</New>
</Set>
</Configure>
但是当启动 Jetty 时我得到了这个:
WARN:oejx.XmlConfiguration:Config error at <Get id="customIdMgr" name="sessionIdManager"/> java.lang.NullPointerException
...这意味着在处理覆盖层时,在主 jetty 配置中注册的对象现在消失了。
知道我在这里做错了什么吗?
最佳答案
经过大量调试后发现,问题的根源是 <Get name="server">
返回空值。最有可能的是,对 Server 类的引用会在部署过程的后期注入(inject)到 WebAppContext 中。因此,我没有使用 Server 来引用它 <Ref id="Server">
这样就成功了。
关于java - Jetty 和自定义 sessionIdManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12088146/