Redis
 sql >> Base de données >  >> NoSQL >> Redis

spring-boot redis :Comment invalider toutes les sessions d'un utilisateur ?

Je voudrais vous savoir que you are following the correct path pour invalider les sessions utilisateur

    usersSessions.forEach((session) -> {        
        sessionRegistry.getSessionInformation(session.getId()).expireNow();
    });

A noter

SessionInformation.expireNow()

n'est pas moyen de supprimer des entrées du redis base de données, il ajoute simplement l'attribut expiré à la session comme vous l'avez mentionné à juste titre.

Mais comment cela invalide la session de l'utilisateur ?

Voici le ConcurrentSessionFilter en jeu où.doFilter() la méthode fait l'affaire de automatically logging out

Voici l'extrait pour ConcurrentSessionFilter

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
        throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;

    HttpSession session = request.getSession(false);

    if (session != null) {
        SessionInformation info = sessionRegistry.getSessionInformation(session
                .getId());

        if (info != null) {
            if (info.isExpired()) {
                // Expired - abort processing
                doLogout(request, response);

                String targetUrl = determineExpiredUrl(request, info);

                if (targetUrl != null) {
                    redirectStrategy.sendRedirect(request, response, targetUrl);

                    return;
                }
                else {
                    response.getWriter().print(
                            "This session has been expired (possibly due to multiple concurrent "
                                    + "logins being attempted as the same user).");
                    response.flushBuffer();
                }

                return;
            }
            else {
                // Non-expired - update last request date/time
                sessionRegistry.refreshLastRequest(info.getSessionId());
            }
        }
    }

    chain.doFilter(request, response);
}

Bravo !