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.

Je ne comprends pas. Le délai d'expiration de session EST la déconnexion automatique. Qu'entendez-vous par "l'utilisateur a à charge de l'application web". Il faut juste être redirigé vers la page de connexion après l'expiration de la session.

OriginalL'auteur Bevor | 2012-05-30