Redirection après le délai d'expiration de HttpSession
J'ai été à la recherche à de nombreux posts sur ce sujet mais n'a pas pu obtenir une solution qui fonctionne dans mon cas.
Je suis à l'aide de Java EE 6 avec JSF 2.0 (déployé sur JBoss as 7.1)
Dans mon web.xml
j'ai:
<session-config>
<session-timeout>1</session-timeout>
</session-config>
et je voulez que l'utilisateur soit redirigé vers la page de connexion lors de la session automatiquement.
ce que j'ai essayé:
Méthode 1: utilisation du filtre
J'ai essayé le filtre suivant:
@WebFilter()
public class TimeOutFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
ServletException {
System.out.println("filter called");
final HttpServletRequest req = (HttpServletRequest) request;
final HttpSession session = req.getSession(false);
if (session != null && !session.isNew()) {
chain.doFilter(request, response);
} else {
System.out.println("Has timed out");
req.getRequestDispatcher("/logon.xthml").forward(request, response);
}
}
@Override
public void destroy() {
}
}
Dans le web.xml
j'ai essayé
<filter-mapping>
<filter-name>TimeOutFilter</filter-name>
<url-pattern>*.xhtml</url-pattern>
</filter-mapping>
et
<filter-mapping>
<filter-name>TimeOutFilter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
Le filtre fonctionne comme il est appelé à chaque demande (enregistrement de "fiter appelé" dans la console). Cependant, il n'est pas appelé lors de la session expire.
Approche 2: HttpSessionLister
J'ai essayé d'utiliser un HttpSessionListerner
. La méthode ayant la signature suivante:
public void sessionDestroyed(HttpSessionEvent se) {
}
Je n'étais pas en mesure de rediriger vers une page spécifique. Quand je veux rediriger un utilisateur que j'utilise habituellement le NavigationHandler
de la FacesContext
mais dans ce cas il n'y a pas de FacesContext
(FacesContext.getCurrentInstance()
retourne null
).
Selon cette postle HttpListener ne peut pas rediriger l'utilisateur car il ne fait pas partie d'une demande.
Question
Quelle est la meilleure voie à suivre pour résoudre ce problème? Que puis-je faire pour l'un des deux mentionnés ci-dessus dans les approches de travail?
source d'informationauteur phoenix7360
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas envoyer une réponse HTTP, tant que le client n'a pas d'envoyer une requête HTTP. Simple que cela. C'est juste la façon dont le HTTP fonctionne. L'Internet serait autrement avait l'air très différent si un site internet a été en mesure de unaskingly pousser une réponse HTTP, sans que le client ait demandé pour elle.
Un JavaScript battement de coeur d'un client de clavier/souris comme répondu iciou une méta
refresh
en-tête comme répondu ici serait la solution si vous avez une page unique webapp (donc, vous êtes effectivement pas à l'aide de l'étendue de session, mais la portée de vue), mais qui ne fonctionne pas bien si vous avez la page s'ouvre dans plusieurs onglets/fenêtres dans la même session.Websockets est, en théorie, la bonne solution pour pousser quelque chose pour le client, mais cela nécessite à son tour une session active. Poulet-Oeuf problème. Aussi, il ne serait pas travailler dans les navigateurs plus anciens actuellement encore relativement répandue, de sorte qu'il devrait actuellement être simplement utilisé pour l'amélioration progressive.
Votre meilleur pari est de définir une page d'erreur qui s'occupe de l'affaire lorsque l'utilisateur appelle une action tandis que la session a expiré. Voir aussi javax.des visages.application.ViewExpiredException: ne peut pas être restauré.
Dans HttpSessionListerner vous ne pouvez pas envoyer de réponse à l'Utilisateur. Un bon moyen d'y parvenir est avec ce vote, le navigateur envoie des requêtes HTTP à intervalles réguliers et reçoit immédiatement une réponse.
Il y a beaucoup de façons de le faire:
Vous pouvez utiliser le bon vieux javascript pour le sondage: Ce sera le travail de la croix-navigateur de l'environnement.
function refresh() {
}
setTimeout(actualisation, 5000);
Vous pouvez utiliser les Web Sockets. Web socket spécification est présent sur le lien ci-dessous:
http://dev.w3.org/html5/websockets/
Je comprends que vous utilisez java EE6 et JSF,mais si vous pouvez essayer d'utiliser de code JSP ou de convertir ce code ci-dessous pour travailler dans une servlet. En supposant que vous utilisez le nom d'utilisateur de vérifier pour la session,après la mise à l'expiration de session dans le web.xml fichier.Veuillez noter que le code JSP et servlet code sont similaires.
Votre code de validation de la session pourrait ressembler à ceci.(JSP Format)
Si le nom d'utilisateur sert de clé primaire dans votre base de données.
Servlet code pourrait ressembler à ceci
Vous pouvez utiliser un Filtre et faites le test suivant: