为了账号安全,请及时绑定邮箱和手机立即绑定

Spring启动会话超时事件监听器

Spring启动会话超时事件监听器

呼啦一阵风 2021-10-28 14:04:18
我想在用户从会话超时中注销时执行自定义事件。用户在我的 application.properties 指定的时间长度后成功注销:server.servlet.session.timeout=10server.servlet.session.cookie.max-age=10我发现了一些涉及 SessionDestroyedEvent 的类似解决方案,例如:@Slf4j@Componentpublic class SessionExpiredListener implements ApplicationListener<SessionDestroyedEvent> {    @Override    public void onApplicationEvent(SessionDestroyedEvent event) {        for (SecurityContext securityContext : event.getSecurityContexts()) {            Authentication authentication = securityContext.getAuthentication();            UserPrincipal user = (UserPrincipal) authentication.getPrincipal(); // UserPrincipal is my custom Principal class            log.debug("Session expired!" + user.getUsername());            // do custom event handling        }    }}问题是 SessionDestroyedEvent 未与会话超时同时触发,在我的测试中,它在会话过期后最多 5 分钟触发。我也尝试过在 HttpSessionListener 中使用 sessionDestroyed 但结果相似。是否有一个事件会在会话到期时触发,或者有什么方法可以实现这一点?
查看完整描述

2 回答

?
森栏

TA贡献1810条经验 获得超5个赞

sessionDestroyed()当 Web 容器使会话过期时调用该方法。在 Tomcat 中,会话过期每分钟都会发生一次,我认为其他 servlet 容器也是如此。因此,即使在会话超时之后,在下一次检测到到期之前也可能会有延迟。

会话管理由 servlet 容器完成,您的应用程序正在从中获取通知。并且无法在会话到期的确切时间收到通知。


查看完整回答
反对 回复 2021-10-28
  • 2 回答
  • 0 关注
  • 155 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信