Spring Boot会话超时事件监听器

时间:2018-10-05 09:11:48

标签: java spring session events timeout

当用户从会话超时中注销时,我想执行自定义事件。在我的application.properties指定的确切时间后,用户已成功注销:

server.servlet.session.timeout=10
server.servlet.session.cookie.max-age=10

我发现了一些涉及SessionDestroyedEvent的类似解决方案,例如:

@Slf4j
@Component
public 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 个答案:

答案 0 :(得分:2)

当Web容器使会话期满时,将调用sessionDestroyed()方法。 在Tomcat中,会话到期每分钟发生一次,我认为其他servlet容器就是这种情况。 因此,即使会话超时后,下一次检测到到期时也可能会有延迟。

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

答案 1 :(得分:0)

当用户通过会话超时注销时,我也处理了该事件。对我而言,此解决方案很有帮助:https://stackoverflow.com/a/18128496/4074871

另外,我必须注册https://stackoverflow.com/a/24957247/4074871中提到的HttpSessionEventPublisher,因为我没有用于注册侦听器的web.xml。