当我使用EhCache作为shiro框架的缓存存储session时,发现每当 服务重启后,Session都失效。进入换成目录可以看到EhCache缓存的index文件没有生成。
分析代码发现当停止服务时 org.apache.shiro.web.env.EnvironmentLoaderListener 这个ServletContextListener没有执行 contextDestroyed 回调方法,导致 EhCache 的数据没有写入磁盘。
我使用的是JFINAL框架,内嵌undertow,shiro配置如下

最后发现是 JFINAL undertow 停止服务的代码是:
protected void doStop() throws ServletException { deploymentManager.stop(); undertow.stop(); }
实际需要调用 deploymentManager.undeploy(); 才能正常的执行 ServletContextListener 生命周期函数。
所以通过子类重新实现 doStop 方法

最后生命周期函数正常执行,EhCache的index文件生成成功,重启服务后session不丢失。
shiro 使用 EhCache 重启服务后Session失效