2
février
2008
Comment gérer le Timeout de la session dans une application JSF
février
2008
Un article de djo.mos
3 Commentaires
Dans l’application sur laquelle je travaille, j’ai eu un ennuyeux problème avec le Session Timeout, surtout avec IE 6 (tiens, c’est bizarre ça ;))
Bref, j’ai pas trouvé grand chose en googlant la chose, alors j’ai du concocter ma propre solution fait maison que voici:
Je passe par un filtre mappé avec la Faces Servlet dont voici le code:
public class TimeoutFilter implements Filter {
private static final Logger log = Logger.getLogger(TimeoutFilter.class);
public void init(FilterConfig conf) throws ServletException {}
public void destroy() {}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest r = ((HttpServletRequest) request);
if (r.getSession(false) == null) {
r.getSession();
((HttpServletResponse) response).sendRedirect(r.getContextPath()+"/timeout.html");
} else {
chain.doFilter(request, response);
}
}
}
En gros, voici ce qu fait ce filtre:
- Je castes le paramètre request en HttpServletRequest.
- Je récupère la session en cours sans pour autant la créer si elle n’existe pas (d’ou le false passé à getSession)
- Si pas de session, alors j’en crée une nouvelle et je redirige vers une page html qui affiche « Session expirée, reconnectez vous, bla bla bla ».
- Sinon, je ne fais rien, je passe la main aux autres filtres de la chaîne.
Il faut ensuite déclarer ce filtre dans web.xml et l’associer à la Faces Servlet:
<filter>
<display-name>Timeout Filter</display-name>
<filter-name>timeout</filter-name>
<filter-class>TimeoutFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>timeout</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
Et voilou, le tour est joué: plus d’écran moche d’exception de Tomcat lors du timeout.
@Pollux:
Justement, normalement le navigateur ne devait pas faire une différence, mais en pratique, j’ai eu des problèmes plus que que bizarres avec IE 6, surtout depuis que j’utilise des templates facelets à plusieurs niveaux ET dynamiques. Je suspecte un problème de caching et/ou de gestion de session …
Plus de détails dans ma réponse à fabszn /
@fabszn:
Voilà, j’ai un managed bean LoginCtrl qui contient entre autre un champ booléen connected qui est false par défaut et true ssi l’utilisateur s’est connecté.
Dans le template facelets principal de mon application, je fais un truc semblable à ceci:
Je lance mon application, j’ouvre une session et je laisses ça sans action le temps que la session expire. Avec Firefox, quand je cliques sur un lien quelconque de ma page, j’ai bien la deuxième section (Vous n’êtes pas autorisé ….), par contre, avec IE 6, j’ai plutôt un horrible écran d’exception de Tomcat (impliquant entre autre une méthode @PostConstruct gérée par Spring).
Je pense que celà vient de ceci: une requête lancée par Firefox recrée une session dans le serveur tandis qu’une requête générée par IE 6 ne le fait pas … ou du moins, ne le fait pas correctement.
Je ne suis pas vraiment spécialiste de HTTP ni de la gestion des sessions. Je ne suis donc pas en mesure d’expliquer ça, mais je serais reconnaissant à celui ou à celle qui éclairera ma lanterne sur ce sujet ;).
Hello,
Avant de mettre en place cette gestion du timeout de session..comment gérais tu ce cas?
Ca me semble quand meme étrange qu’il y ait des problèmes particulier avec IE. La gestion de la session se fait entièrement côté serveur, le navigateur ne fait que suivre l’id de la session. Je suis un peu sceptique. Tu peux développer?