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;
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.
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);
}
J'ai eu le même problème, comme
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
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"/>
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)