当 http 会话显式无效时,将调用以下安全会话侦听器:SingleSignOnAuthenticationMechanism#SessionInvalidationListener
用户JSESSIONIDSSO
在响应中获得新的 cookie。一切正常。但是当 Session 因超时而失效时,在会话侦听器中,我们不会调用使用户从 SSO 注销的代码:
@Override
public void sessionDestroyed(Session session, HttpServerExchange exchange, SessionDestroyedReason reason) {
String ssoId = (String) session.getAttribute(SSO_SESSION_ATTRIBUTE);
if (ssoId != null) {
try (SingleSignOn sso = manager.findSingleSignOn(ssoId)) {
if (sso != null) {
sso.remove(session);
if (reason == SessionDestroyedReason.INVALIDATED) {
for (Session associatedSession : sso) {
associatedSession.invalidate(null);
sso.remove(associatedSession);
}
}
// If there are no more associated sessions, remove the SSO altogether
if (!sso.iterator().hasNext()) {
manager.removeSingleSignOn(ssoId);
}
}
}
}
}
问题是,为什么它以这种方式工作?我可以强制 undertow 调用 associatedSession.invalidate(null); 和 sso.remove(关联会话);http会话超时?现在,当 http 会话到期时,用户继续使用旧的 JSESSIONIDSSO,服务器不提供更改它。