Heim  >  Artikel  >  Java  >  Fallbeispiel einer Javaweb-Lernsitzung: So lösen Sie wiederholte Übermittlungen von Formularen

Fallbeispiel einer Javaweb-Lernsitzung: So lösen Sie wiederholte Übermittlungen von Formularen

php是最好的语言
php是最好的语言Original
2018-07-28 10:15:501659Durchsuche

index.jsp TokenServlet.java für die Formularübermittlungsverarbeitung Servlet

1. Wiederholte Übermittlung:

 ① Senden Sie das Formular an ein Servlet, und das Servlet antwortet auf eine JSP ( html) Seite durch Anforderungsweiterleitung Zu diesem Zeitpunkt behält die Adressleiste noch den Pfad des Servelt bei. Klicken Sie auf der Antwortseite auf „Aktualisieren“. Klicken Sie auf die Schaltfläche „Senden“, wenn die Antwortseite den Browser nicht erreicht hat. Klicken Sie auf der übermittelten Seite auf „Zurück“. ", und klicken Sie dann auf „Senden“;

2. Es handelt sich nicht um eine wiederholte Übermittlung: Klicken Sie auf der Seite, auf der das Formular übermittelt wurde, auf „Zurück“, dann auf „Aktualisieren“ der ursprünglichen Formularseite und dann „Senden“

3. So vermeiden Sie eine wiederholte Übermittlung des Formulars:

Markieren Sie beim Senden an das Servlet, ob die Markierung vorhanden ist und ob sie damit übereinstimmt die vordefinierte Markierung

Wenn sie konsistent ist, wird die Anfrage angenommen und die Markierung vernichtet;

Wenn sie inkonsistent ist oder keine Markierung vorhanden ist, antworten Sie direkt auf die Eingabeaufforderung: „Doppelte Einreichung“

① Option 1: Geben Sie nur ein verstecktes Feld an: 5881c2e62d61ab914c6fe21cf4a191c1 , nicht machbar, Grund: //Markierung löschen: Es gibt keine Möglichkeit zum Löschen feste Anfrageparameter

 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: Fügen Sie das Tag in die Anfrage ein, es funktioniert nicht. Denn nachdem die Formularseite aktualisiert wurde, wurde die Anfrage zerstört und das Absenden des Formulars wird eine neue Anfrage sein

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 }

③ Lösung drei: Fügen Sie das Tag in die Sitzung ein. Ja. Durch

verstecktes Feld

und

Attributfeldwert festlegen

Methode 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 }

Erfolg .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. Zusammenfassung

1) Die Verwendung der Umleitung kann einige Probleme bei der Formularübermittlung lösen.

 2) Verhindern Sie die wiederholte Übermittlung von Formularen, indem Sie Attributfelder und ausgeblendete Felder während der Sitzung kombinieren.

Verwandte Artikel:

So lösen Sie das Problem der wiederholten Übermittlung von PHP-Formularen, wiederholte Übermittlung von PHP-Formularen

Javascript - Wie So lösen Sie das Aktualisierungsseitenformular in PHP. Doppelte Übermittlung?

Das obige ist der detaillierte Inhalt vonFallbeispiel einer Javaweb-Lernsitzung: So lösen Sie wiederholte Übermittlungen von Formularen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn