Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

spring-boot redis :Como invalidar todas as sessões de um usuário?


Gostaria de saber se you are following the correct path para invalidar as sessões do usuário
    usersSessions.forEach((session) -> {        
        sessionRegistry.getSessionInformation(session.getId()).expireNow();
    });

Algo a observar
SessionInformation.expireNow()

não significa remover entradas do redis banco de dados, ele apenas anexa o atributo expirado à sessão, como você mencionou corretamente.

Mas como isso invalida a sessão do usuário?

Aqui entra o ConcurrentSessionFilter em jogo onde.doFilter() método faz o truque de automatically logging out

Aqui está o snippet para 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);
}

Um brinde a isso!