Comment éviter de soumettre à nouveau dans jsp lors d'un rafraîchissement?

j'écris un programme, mais je rencontre un problème: lorsque je rafraîchis la page jsp, le système renvoie automatiquement la page entière, et je ne sais pas comment l'éviter, quelqu'un peut-il m'aider ?

17
demandé sur MemoryLeak 2009-08-23 05:17:03

6 réponses

Voici une explication du problème...

en cliquant sur le bouton" Soumettre " d'un formulaire, vous envoyez une demande au serveur web, qui inclut toutes les données saisies sur le formulaire. Non seulement L'URL mais aussi les données du formulaire font partie de la requête, et cette requête est mémorisée par le navigateur. Si l'utilisateur clique sur "Actualiser", le navigateur répète la requête, en envoyant la même URL et formez de nouveau les données vers le serveur web.

mais les formulaires peuvent être présentés en deux différentes façons, GET ou POST, en fonction de l'attribut" method "de la balise" form". Il existe une convention selon laquelle une requête GET n'a aucun effet secondaire; elle ne récupère que les données mais n'apporte aucune modification à la base de données. Par contre, si une requête modifie des données, elle doit toujours utiliser une requête POST. Comme je l'ai dit, ce ne sont que des conventions, et il n'y a pas beaucoup de différence technique entre eux, mais une différence très importante est que les navigateurs avertiront l'utilisateur s'ils essaient de répéter un message -- en cliquant sur" rafraîchir " apparaîtra une boîte de dialogue avertissant l'utilisateur que cela peut provoquer une opération à être répétée, et confirmant qu'ils veulent vraiment soumettre à nouveau. Le navigateur n'affiche pas cette confirmation lors de la mise à jour d'une requête GET.

votre formulaire utilise-t-il la méthode GET, comme le soupçonne @mk? Si c'est le cas, le changer en POST est la solution la plus simple, car cela signifie au moins que l'utilisateur est averti s'ils essaient de se rafraîchir.

mais une meilleure solution est la POST+REDIRECT+GET idiom suggéré par @cletus. Cela divise la mise à jour de la base de données (POST) et la vue (GET) en deux opérations. En cliquant rafraîchir sur le navigateur alors ne fait que répéter L'GET, qui n'a pas d'effets secondaires.

18
répondu Todd Owen 2009-08-23 02:26:39

Le langage que vous voulez est ici:

  1. POST+REDIRECT+GET;
  2. présentation du formulaire AJAX.

POST+REDIRECTION+fonctionne comme ceci:

  1. les soumissions de formulaires utilisent la méthode de la poste;
  2. Quand la page JSP ou (espérons-le) de la servlet reçoit le courrier, il fait ce qu'il doit faire (des sauvegardes ou des mises à jour de données ou de quoi que ce soit);
  3. le servlet ou JSP utilise alors un en-tête Location: HTTP pour rediriger l'utilisateur à ce qui est probablement la même URL.

l'avantage de ceci est que cliquer recharger ne va pas soumettre à nouveau le formulaire. Aussi, si vous cliquez sur le bouton précédent du navigateur, vous n'obtiendrez pas invité à "soumettre à nouveau?" dialogue.

Voici un exemple JSP de ce.

L'AJAX submit signifie qu'au lieu de renvoyer le formulaire au serveur dans le sens traditionnel, vous créez une requête AJAX de retour au serveur avec les données du formulaire. Que soumettre n' ce dont elle a besoin. Cliquez sur Recharger pour recharger la page. Il ne va pas renvoyer la demande AJAX.

10
répondu cletus 2009-08-23 01:46:43

Ne pas utiliser pour OBTENIR la soumission ou en modifiant les données. Utilisez POST à la place. Vous voudrez changer votre forme pour lire

<form action="test.jsp" method="get">

http://www.google.com/search?q=get+poste pour plus d'info.

(Votre question est un peu floue - entendez-vous rafraîchissant dans le navigateur, ou dans le conteneur (par exemple Tomcat)? Qu'entendez-vous la soumettre de nouveau la page? Les Pages ne sont pas soumises, les formulaires le sont. Quel système? J'ai deviné ce que tu voulais dire, si tu voulais dire autre chose, laisse - le nous savoir.)

0
répondu mk. 2009-08-23 01:32:07

si vous utilisez JSP dans le serverside et que vous utilisez un Servlet de controller pour contrôler la direction de la page. Vous pouvez simplement changer le mode de direction de la Page de la Redirection de page en page. De cette façon, vous pouvez empêcher le formulaire de soumettre à nouveau. ce serait divers pour le comprendre

cordialement!

0
répondu didxga 2010-08-25 09:41:14

Voici la solution

@RequestMapping(value="masterrulescreation")
protected ModelAndView masterrules(HttpServletRequest request, HttpServletResponse     response) throws Exception {
    try {   

        if(request.getParameter("ruleCode")!=null && request.getParameter("ruleCode")!="") //check the primary key is not null ,if goes for submission
        {
        request.setCharacterEncoding("UTF-8");

        String xxx=request.getParameter("xxx");
        S
        boolean result=object.method(xxx);
        String message="";//reurning a messgae is sucess
        if(result==true)
        {
            message="Data Saved successfully";
        }
        else
        {
            message="Error while saving data";  
        }

        return  (new ModelAndView(getMasterrulescreation(),"message",message));
        }
        else //if no value in primary key redirect fresh page 
        {
            return  (new ModelAndView(getMasterrulescreation()));
        }
    }
    catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}   
0
répondu alex john 2014-08-19 10:35:46

nous pouvons utiliser post/Redirect / Get (PRG) pattern pour résoudre le problème de plusieurs de soumission des mêmes données.

Cela fonctionne comme suit:

première fois lorsqu'un utilisateur soumet un formulaire au serveur par la poste ou obtenir méthode, puis nous mettons à jour l'état dans la base de données d'application.

Ensuite nous envoyer une réponse de redirection pour envoyer la réponse au client.

ensuite nous chargeons une vue en utilisant la commande GET. Il n'y a aucune donnée n'est envoyé dans le présent. Depuis cette nouvelle page JSP, il est à l'abri de multiples soumettre. Le code qui traite la requête est idempotent. De sorte qu'il ne pas faire la même action deux fois pour la même demande.

enter image description here

0
répondu Premraj 2018-06-09 01:23:27