Redis
 sql >> Database >  >> NoSQL >> Redis

spring-boot redis:come invalidare tutte le sessioni di un utente?

Vorrei sapere che you are following the correct path per invalidare le sessioni utente

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

Qualcosa da notare

SessionInformation.expireNow()

non significa rimuovere voci da redis database, aggiunge semplicemente l'attributo scaduto alla sessione come hai giustamente menzionato.

Ma come questo invalida la sessione dell'utente?

Ecco che entra in gioco ConcurrentSessionFilter dove.doFilter() il metodo fa il trucco di automatically logging out

Ecco lo snippet per 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);
}

Complimenti!