web-dev-qa-db-fra.com

Comment obtenir un message d'expiration de session à l'aide de la sécurité Spring

Je souhaite recevoir le message d'expiration de la session à l'expiration de la session. Voici mon spring-security.xml

<http auto-config="true" use-expressions="true">
    <logout logout-success-url="/" invalidate-session="true" logout-url="/LogOut"/>
    <form-login login-page="/Login" username-parameter="Name" password-parameter="Pwd"/>
    <session-management invalid-session-url="/?timeout=true">
        <concurrency-control max-sessions="1" expired-url="/Timeout?timeout=true" />
    </session-management>
</http>

À ma connaissance, en utilisant le code ci-dessus lorsque la session a expiré, il devrait être redirigé vers /?timeout=true OR /Timeout?timeout=true. Et à la déconnexion, il devrait aller à /. Mais dans mon cas, lors de la déconnexion, sa redirection vers invalid-session-url est donc toujours vrai que le dépassement de délai est vrai tant pour la déconnexion normale que pour le délai de session.

S'il vous plaît aidez-moi à différencier cela.

METTRE &AGRAVE; JOUR

La demande /logout contient 

session = request.getSession();
session.invalidate();
session = null;
7
Prasanna Kumar

Je l'ai résolu! en écrivant un filtre à la place selon Spring-security.

Si quelqu'un est intéressé, il peut utiliser le code ci-dessous: - 

import Java.io.IOException;
import Java.io.PrintWriter;
import Java.io.StringWriter;
import Java.text.MessageFormat;

import javax.servlet.FilterChain;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.Apache.log4j.Logger;
import org.springframework.web.filter.OncePerRequestFilter;

public class FilterToGetTimeOut extends OncePerRequestFilter {

    @Override
    public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException {
        try {
            if(request.getRequestURI().equals("/") || request.getRequestURI().equals("/Login/")){
                if(request.getSession().getAttribute("login") != null && (Boolean)request.getSession().getAttribute("login") == true){
                    response.sendRedirect(URL);     //After login page
                }
            } else if(request.getSession().getAttribute("login") == null && !request.getRequestURI().equals("/LogOut")){
                response.sendRedirect(request.getContextPath()+"/?timeout=true");   //If timeout is true send session timeout error message to JSP
            }
            filterChain.doFilter(request, response);
        } catch (Exception e) {
            //Log Exception

        }
    }
}

Ajoutez ce filtre dans web.xml.

    <filter>
        <filter-name>FilterToGetTimeOut </filter-name> 
        <filter-class>package.FilterToGetTimeOut </filter-class> 
    </filter>
    <filter-mapping> 
        <filter-name>FilterToGetTimeOut</filter-name> 
        <url-pattern>/*</url-pattern> 
    </filter-mapping> 

Alors maintenant, la session est également invalide et je peux aussi gérer le délai d’expiration de la session.

5
Prasanna Kumar

Je vous suggère de vous déconnecter en utilisant ceci:

HttpSession session= request.getSession(false);
    SecurityContextHolder.clearContext();
        if(session != null) {
            session.invalidate();
        }
        for(Cookie cookie : request.getCookies()) {
            cookie.setMaxAge(0);
        }
3
FreezY

J'ai eu le même problème, comme 

  1. Si vous vous êtes connecté avec un utilisateur, dites zzzz
  2. Vous avez fermé le navigateur
  3. Encore une fois, vous essayez de vous connecter avec le même utilisateur zzzz
  4. Échec de la connexion avec un message pour le nombre maximal de sessions dépassé

Le code que j'ai sur mon fichier de sécurité de printemps est:

<session-management invalid-session-url="/?timeout=true">
<concurrency-control max-sessions="1" expired-url="/logout?timeout" />

J'ai résolu ce problème en ajoutant l'entrée de délai d'expiration de la session dans le fichier web.xml. J'ai fixé la valeur du délai d'expiration de la session à 5 min, puis créé l'application et déployé. Son fonctionnement est optimal.

Peut-être que cela aidera quelqu'un.

Merci, Atul

0
Atul

Dans votre cas, ce qui se passe est le moment où un utilisateur se déconnecte, la session est d'abord invalidée, puis la gestion de la session se déclenchera. Lorsque la gestion de session arrive et que la session est déjà terminée, la page sessionTimeout sera redirigée. Il sera donc préférable de définir la balise invalidate-session of logout sur false.

<logout logout-success-url="/" invalidate-session="false" logout-url="/LogOut"/>
0
Eva Mariam

Veuillez définir le mappage des demandes pour l'URL logout-success dans votre contrôleur et à partir de là, rediriger vers la page d'accueil. par exemple, remplacez votre mapping comme ci-dessous

<http auto-config="true" use-expressions="true">
<logout logout-success-url="/logoutSucess" invalidate-session="true" logout-url="/LogOut"/>
<form-login login-page="/Login" username-parameter="Name" password-parameter="Pwd"/>
<session-management invalid-session-url="/?timeout=true">
    <concurrency-control max-sessions="1" expired-url="/Timeout?timeout=true" />
</session-management>

définir cette/logoutSucess dans le contrôleur avec @RequestMapping (value = "/ logoutSucess", méthode = RequestMethod.GET)

0
Kunwar Babu