Comment mettre en œuvre une déconnexion automatique dans une application web?
Notre application web fonctionne avec JBoss 7.1.1 et Java (JPA2 et RichFaces4). Au moment où le problème est que l'application est juste coincé si l'utilisateur est connecté, mais ne fait rien à l'intérieur de l'application pour un certain temps (probablement due à l'expiration de la session). Ensuite, l'utilisateur doit charger l'application web de nouveau, qui n'a pas l'air très professionnel.
Pouvez-vous me donner un indice, comment une déconnexion automatique peut être mis en œuvre à l'aide de l'mentionnées technologies?
[Mise à JOUR]
J'ai essayé beaucoup de possibilités, mais aucun d'eux ne fonctionne correctement. Ma pensée est de mettre en œuvre un SessionTimeoutListener qui sait quand la session obtient expiré:
@Logged
@WebListener
@Named
public class SessionTimeoutListener implements HttpSessionListener
{
@Inject
private Logger logger;
@Override
public void sessionCreated(HttpSessionEvent event)
{
//not used.
}
@Override
public void sessionDestroyed(HttpSessionEvent event)
{
logger.info("Session destroyed.");
ApplicationContext.setAutoLoggedOut(true);
}
}
Cela fonctionne. Mais alors tous les problèmes apparaissent: je ne peux pas rediriger parce FacesContext est null. Je ne peux pas le feu poussez les événements parce que je reçois des exceptions, comme NameNotFoundException ou similaire (j'ai essayé beaucoup de choses, mais il semble que déclenche des événements à ne pas sortir de cette trop). Ensuite, j'ai essayé a4j:un sondage sur ApplicationContext.isAutoLoggedOut() mais cela ne fonctionne pas non plus, parce que si j'exécute sondage événements, la session n'expire jamais. Je viens toujours à une impasse. Si je pouvais rediriger en quelque sorte de SessionTimeoutListener, ce serait la solution.
[SOLUTION]
Je suis maintenant satisfait, avec une déconnexion qui est exécutée lorsque je clique sur n'importe quel bouton à l'intérieur de la vue après la session a expiré. Cette solution n'est rudimentaire et ne pas être applicable pour la production, mais cette solution fonctionne et je vais construire sur elle:
J'utilise la partie supérieure SessionTimeoutListener. Par ailleurs, j'ai utiliser un PhaseListener qui est appelée après la SessionTimeoutListener, donc si la session expire, le SessionTimeoutListener sera invoquée et détruit la session, mais le SessionTimeoutPhaseListener a encore le FacesContext. Donc, je peux rediriger là pour page de déconnexion:
public class SessionTimeoutPhaseListener implements PhaseListener
{
private static final long serialVersionUID = -8603272654541248512L;
@Override
public void beforePhase(PhaseEvent event)
{
//not used.
}
@Override
public void afterPhase(PhaseEvent event)
{
FacesContext facesContext = event.getFacesContext();
if (ApplicationContext.isAutoLoggedOut())
{
ApplicationContext.setAutoLoggedOut(false);
try
{
facesContext.getExternalContext().redirect("./logout.xhtml");
}
catch (IOException e)
{
}
}
}
@Override
public PhaseId getPhaseId()
{
return PhaseId.RESTORE_VIEW;
}
}
L'ApplicationContext est une classe avec @ApplicationScoped qui stocke les variables booléennes, mais cela doit être changé, car il affecte tous les utilisateurs qui travaille actuellement avec l'application. Je pense que sur certains "ThreadLocal contexte" pour le résoudre. J'ai encore de distinguer entre la déconnexion automatique et manuel de déconnexion. L'auditeur est appelé dans les deux cas. Bien que cette solution fonctionne pour le moment, la redirection dans PhaseListener est également délicate, car il serait appelé maintes et maintes fois par JSF (qui provoque une boucle de redirection des erreurs dans le navigateur), si je n'aurais pas mis "autoLoggedOut" pour de faux.... comme je l'ai dit, que de façon rudimentaire, mais à l'aide de la PhaseListener est probablement la seule solution appropriée.
OriginalL'auteur Bevor | 2012-05-30
Vous devez vous connecter pour publier un commentaire.
Si vous souhaitez gérer le ViewExpiredException, vous pouvez ajouter le paramètre suivant à votre web.xml
Mieux encore, utilisez un PhaseListener tio vérifier si l'Utilisateur est toujours disponible dans la Session.
Si ce n' - accédez à la page de connexion.
Web.xml il est. Merci de remarquer. Avez édité la réponse
À l'aide d'un PhaseListener est la seule partie de solution pour l'instant. Voir ma mise à jour de l'affichage.
moi aussi j'ai le même problème, et <erreur-page> ne fonctionne pas
OriginalL'auteur kostja
Il y a deux façons que vous pouvez faire ceci:
1 Utilisation du mécanisme d'attraction
Toutes les 5 secondes ou alors, continuez à demander de serveur si la session est valide ou pas, si le serveur dit oui valide, le sommeil pour la période de temps spécifiée, si le serveur dit non valide, afficher un message à l'utilisateur, et de déconnexion.
2 Utiliser push mécanisme
Utilisation
a4j:push
, si dans votre serveur, vous avez unTimerTask
qui s'exécute dit toutes les 5 secondes pour vérifier si la session est valide ou pas, si elle le juge de session est valide, le sommeil, si invalide, envoyer un message à un utilisateur, puis déconnexion.Ressemble RichFaces4 démo en ligne ne fonctionne pas, vérifier si ce lien
Je ne suis pas sûr si RichFaces a quelque chose comme Primefaces Ralenti Moniteur
Une autre solution est d'utiliser Personnalisé HttpSessionListener
OriginalL'auteur mprabhat
Vous devez configurer le délai d'expiration de session dans votre web.xml la valeur est en quelques minutes et ne peut être inférieur à 1:
Vous devez ajouter un filtre qui va vérifier si la session a expiré:
Le filtre ressemblera à ceci:
OriginalL'auteur Luiggi Mendoza
Puisque c'est le web, vous pouvez utiliser du javascript:
OriginalL'auteur naspinski