今天在工作中遇到这样一个问题,我的项目存在一个自己写的单点登录的功能,实现的方式是数据库中存在一个字段表示登录状态,当用户登录和退出时,会触发修改这个字段的操作。问题就出在这里,当用户登录后,程序意外停止,或者是我在调试的过程中重启服务,该字段会一直是登录中,那么有没有相关的解决方案呢?
我的想法是在项目第一次运行的时候,进行以尝更新操作,将所有用户的登录状态全部改变,既然想到了,那就去实现它吧。
一、在 web.xml 中配置监听器
这里是初始化时调用的类
二、编写初始化时调用的类,该类需要继承自 ServletContextListener
这里需要实现它的两个方法,contextInitialized 和 contextDestoryed
通过名字,我们可以知道,contextInitialized 是项目初始化时调用的方法,而 contextDestoryed 是项目关闭时调用的方法,那么目标很明确,我直需要在 contextInitialized 编写我的业务逻辑就可以了。
PS:为什么我不使用 contextDestoryed 来进行这个功能的实现呢?比方说项目要关闭了,我就把所有的用户登录状态给重置了,这样一来,还可以加快项目的启动速度,何乐而不为呢?
这里需要注意的是,这个方法只有在容器正常停止的过程中才会调用,比如在任务管理器或者使用 kill 命令把进程杀掉,就不会调用到这个方法,也就为程序埋藏了一个 bug,这里就不如 contextInitialized 更容易被控制了,所以选择在程序的初始化过程中进行操作。
领取专属 10元无门槛券
私享最新 技术干货