IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JSF Java Discussion :

Empêcher de lancer plusieurs fois l'action (multi clic)


Sujet :

JSF Java

  1. #1
    Membre habitué
    Inscrit en
    Mars 2009
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 154
    Points : 149
    Points
    149
    Par défaut Empêcher de lancer plusieurs fois l'action (multi clic)
    Bonjour,

    J'ai un soucis : lorsque l'on clique plusieurs fois de suite rapidement sur un bouton, l'action associée s'exécute plusieurs fois.

    Cela se produit aussi lorsqu'on fait un F5 et qu'on ressoumet la requête.

    j'ai réglé en parti le problème via un phase listener en ignorant les clics suivants le premier... mais je n'arrive pas à rediriger sur la page de destination du premier clic (en annulant je ne peux renvoyer que par un page par défaut).

    Quelqu'un en saurait-il plus que moi sur ce sujet ?

  2. #2
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    tu utilise Richfaces?

  3. #3
    Membre habitué
    Inscrit en
    Mars 2009
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 154
    Points : 149
    Points
    149
    Par défaut
    Oui j'utilise RichFaces, mais j'aimerais une solution autre que sur les boutons ajax afin qu'elle puisse s'appliquer aussi aux rafraichissements de la page.

  4. #4
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    Citation Envoyé par Fafhrd Voir le message
    Oui j'utilise RichFaces, mais j'aimerais une solution autre que sur les boutons ajax afin qu'elle puisse s'appliquer aussi aux rafraichissements de la page.
    tu as des solutions en javascript.. tu dois trouver des exemples dans le forum javascript.

  5. #5
    Membre habitué
    Inscrit en
    Mars 2009
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 154
    Points : 149
    Points
    149
    Par défaut
    La solution javascript n'est pas pérenne. Elle peut être contournée à partir de n'importe quel navigateur... alors si une action peut faire des insertions de données, ça sera une faute de sécurité grave.

    Je cherche vraiment une solution côté serveur.

  6. #6
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    Citation Envoyé par Fafhrd Voir le message
    La solution javascript n'est pas pérenne. Elle peut être contournée à partir de n'importe quel navigateur... alors si une action peut faire des insertions de données, ça sera une faute de sécurité grave.

    Je cherche vraiment une solution côté serveur.
    regarde d'abord la solution javascript, c'est juste pour prévenir le double click, le controle de 'laction sera toujours coté serveur, le problème avec le javascript est qu'il peut être désactivé.
    Avec Struts, il y'avait un mécanisme de jetons, et même avec ça ce n'était pas facile, en JSF, il faut tout réinventer.

  7. #7
    Membre habitué
    Inscrit en
    Mars 2009
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 154
    Points : 149
    Points
    149
    Par défaut
    Oui, j'ai déjà entendu parler de jetons ou machine à état.

    Bon voici ce que j'ai fait. Peut-être que ça pourrait être une bonne solution si on arrive à l'améliorer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    public class ResubmitMethodInterceptor implements PhaseListener {
     
        private static final Logger LOG = Logger.getLogger(ResubmitMethodInterceptor.class);
     
        public void afterPhase(PhaseEvent event) {}
     
        public void beforePhase(PhaseEvent event) {
            if (event.getPhaseId().equals(PhaseId.INVOKE_APPLICATION)) {
                LOG.debug("beforePhase(..) : " + event.getPhaseId());
     
                FacesContext facesContext = event.getFacesContext();
                HttpServletRequest request = (HttpServletRequest) facesContext.getExternalContext().getRequest();
     
                String oldViewState = (String) request.getSession().getAttribute(Constantes.BEAN_OLD_VIEW_STATE);
                LOG.debug("oldRequest récupérée");
                if (oldViewState != null) {
                    if (oldViewState.equals(request.getParameter("javax.faces.ViewState"))) {
                        LOG.debug("requêtes identiques");
                        NavigationHandler nh = facesContext.getApplication().getNavigationHandler();
                        nh.handleNavigation(facesContext, null, Constantes.FWD_RESUBMIT);
                    } else {
                        LOG.debug("requêtes différentes");
                        request.getSession().setAttribute(Constantes.BEAN_OLD_VIEW_STATE, request.getParameter("javax.faces.ViewState"));
                    }
                } else {
                    LOG.debug("oldRequest null : stockage de la nouvelle request");
                    request.getSession().setAttribute(Constantes.BEAN_OLD_VIEW_STATE, request.getParameter("javax.faces.ViewState"));
                }
     
                LOG.debug("FIN beforePhase(..)");
            }
        }
     
        public PhaseId getPhaseId() {
            return PhaseId.ANY_PHASE;
        }
    }
    Mon problème c'est dans l'utilisation du NavigationHandler nh.
    Je ne sais pas comment récupérer la variable qui est retournée par la méthode (le String qui permet le mapping avec le face-config). Si je trouvais comment le récupérer, je pourrais remplacer Constantes.FWD_RESUBMIT par ça...

    Une idée ?

Discussions similaires

  1. [C#][ActiveX] Lancer plusieurs fois le contrôle
    Par Nico1987 dans le forum ASP.NET
    Réponses: 4
    Dernier message: 04/02/2009, 16h15
  2. Comment empêcher de lancer plusieurs instances d'un programme?
    Par homeostasie dans le forum Code::Blocks
    Réponses: 1
    Dernier message: 28/10/2008, 21h14
  3. empêcher donnée revenir plusieurs fois
    Par jeepibmx dans le forum Langage
    Réponses: 3
    Dernier message: 17/09/2008, 17h04
  4. Lancer plusieurs fois la meme thread
    Par andromeda dans le forum Concurrence et multi-thread
    Réponses: 19
    Dernier message: 26/09/2007, 13h32
  5. Réponses: 23
    Dernier message: 08/02/2006, 09h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo