Maison  >  Article  >  Java  >  Cas de session d'apprentissage Javaweb : comment résoudre les soumissions répétées de formulaires

Cas de session d'apprentissage Javaweb : comment résoudre les soumissions répétées de formulaires

php是最好的语言
php是最好的语言original
2018-07-28 10:15:501626parcourir

index.jsp TokenServlet.java pour le traitement de la soumission du formulaire Servlet

1. Soumission répétée :

 ① Soumettez le formulaire à un servlet, et le servlet répond à un JSP ( html) via redirection de demande À ce stade, la barre d'adresse conserve toujours le chemin du Servelt. Cliquez sur « Actualiser » sur la page de réponse ;

 ② Cliquez sur le « bouton Soumettre » lorsque la page de réponse n'a pas atteint le navigateur

 ③ Dans la page qui a été soumise, cliquez sur « Retourner » ; ", puis cliquez sur "Envoyer" ;

2. Il ne s'agit pas d'une soumission répétée : sur la page où le formulaire a été soumis, cliquez sur "Retourner", puis "actualiser" la page du formulaire d'origine, puis "Soumettre"

3. Comment éviter les soumissions répétées du formulaire :

Faites une marque dans le formulaire, vérifiez si la marque existe et si elle est cohérente avec. la marque prédéfinie
Si elle est cohérente, la demande sera acceptée et la marque sera détruite ;
Si elle est incohérente ou s'il n'y a pas de marque, répondez directement au message d'invite : "Soumission en double"

① Option 1 : Fournissez un seul champ masqué : 5881c2e62d61ab914c6fe21cf4a191c1, impossible, raison : //Effacer la marque : Il n'y a aucun moyen d'effacer paramètres de requête fixes

 index.jsp

 1 <body>
 2     <%
 3         request.setAttribute("token", "tokenValue");
 4     
 5     %>
 6     
 7     <form action="<%= request.getContextPath() %>/tokenServlet" method="post">
 8         
 9     <input type="hidden"  name="token" value="jason"/> 
10     
11             
12             
13             name:<input type="text" name="name"/>
14             <input type="submit" value="submit"/>
15     
16     </form>
17 
18 </body>

TokenServlet.java

1 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
2     
3         String token = request.getParameter("token");
4         if("jason".equals(token)){
5             //清除标记:没有方法清除固定的请求参数
6         }
7 
8 }

② Option 2 : Mettez la balise dans la requête, ça ne marche pas. Parce qu'une fois la page du formulaire actualisée, la demande a été détruite, puis la soumission du formulaire sera une nouvelle demande

index.jsp

 1 <body>
 2     <%
 3         request.setAttribute("token", "tokenValue");
 4     %>
 5     
 6     <form action="<%= request.getContextPath() %>/tokenServlet" method="post">
 7         
 8     <input type="hidden"  name="token" /> 
 9     
10             
11             
12             name:<input type="text" name="name"/>
13             <input type="submit" value="submit"/>
14     
15     </form>
16 
17 </body>

TokenServlet.java

 1 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
 2 Object token = request.getAttribute("token");
 3         
 4         if(token != null){
 5             //清除标记:没有方法清除固定的请求参数
 6         }else{
 7             response.sendRedirect( request.getContextPath() + "/token/token.jsp");
 8             return;
 9             
10         }
11 }

③ Option 3 : Mettre la note dans la séance. Oui. Via le champ caché et la définition de la valeur du champ d'attribut

index.jsp

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <%@ page import="java.util.*" %>
 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 5 <html>
 6 <head>
 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 8 <title>避免表单的重复提交</title>
 9 </head>
10 <body>
11     <%
12         
13         String tokenValue = new Date().getTime() + "";
14         session.setAttribute("token", tokenValue );
15     %>
16     
17     <form action="<%= request.getContextPath() %>/tokenServlet" method="post">
18        <!-- 隐藏域 --> 
19     <input type="hidden"  name="token" value="<%= tokenValue %>"/> 20     
21             
22             
23             name:<input type="text" name="name"/>
24             <input type="submit" value="submit"/>
25     
26     </form>
27 
28 </body>
29 </html>

TokenServlet.java

 1 package com.jason.token.servlet;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.servlet.ServletException;
 6 import javax.servlet.annotation.WebServlet;
 7 import javax.servlet.http.HttpServlet;
 8 import javax.servlet.http.HttpServletRequest;
 9 import javax.servlet.http.HttpServletResponse;
10 import javax.servlet.http.HttpSession;
11 
12 
13 @WebServlet("/tokenServlet")
14 public class TokenServlet extends HttpServlet {
15     private static final long serialVersionUID = 1L;
16 
17     
18     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
19         
20         //1.获取session
21          HttpSession session = request.getSession();
22         
23          //2.获取设置好的属性域值
24          Object token = session.getAttribute("token");
25          
26          //3.获取隐藏域的值
27          String tokenValue = request.getParameter("token");
28          
29          //4.处理,若 token不为空,且token 和tokenValue相同
30         if(token != null && token.equals(tokenValue)){
31             //5.去除标记
32             session.removeAttribute("token");
33         }else{
34             //6.重定向到提示页面
35             response.sendRedirect( request.getContextPath() + "/token/token.jsp");
36             return;
37         }
38         //7.去除标记后,重定向到 成功页面
39         response.sendRedirect( request.getContextPath() + "/token/success.jsp");
40         
41     }
42 
43 }

Success.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>


    <h4>成功</h4>

</body>
</html>

token.jsp

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>Insert title here</title>
 8 </head>
 9 <body>
10     <h4> 重复提交了表单  </h4>
11 </body>
12 </html>

4. Résumé

1) L'utilisation de la redirection peut résoudre certains problèmes de soumission de formulaire.

 2) Empêchez la soumission répétée de formulaires en combinant les champs d'attributs et les champs masqués via la session.

Articles connexes :

Comment résoudre le problème de la soumission répétée de formulaires php, soumission répétée de formulaires php

javascript - Comment pour résoudre le formulaire de page d'actualisation dans PHP Soumission en double ??

Vidéos associées :

Tutoriel sur le formulaire de vérification du développement JS

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn