当我使用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失效

发表评论