Javaweb ラーニング セッションの事例: フォームの繰り返し送信を解決する方法

php是最好的语言
リリース: 2018-07-28 10:15:50
オリジナル
1675 人が閲覧しました

index.jsp フォーム送信を処理するためのフォームサーブレットによって送信されたページの TokenServlet.java

1. 繰り返し送信:

① フォームはサーブレットに送信され、サーブレットはリクエスト転送 A JSP を通じて応答します。 (html) ページでは、アドレス バーには Servelt のパスが残ります。回答ページで「更新」をクリックします。

② 回答ページがブラウザに到達していない場合は、「送信ボタン」をクリックします。

③ 送信されたページで「戻る」をクリックし、「送信」をクリックします。

2. 重複送信ではありません: フォームが送信されたページで、[戻る] をクリックし、元のフォーム ページを [更新] をクリックして、[送信] をクリックします。

3. 重複送信を回避する方法フォームの送信:

フォームにマークを付けます。サーブレットに送信するときに、タグが存在するかどうかを確認し、事前定義されたタグと一致している場合は、リクエストが受け入れられ、タグが破棄されます。一貫性がない場合、またはタグがない場合は、プロンプト メッセージに直接応答します: 「送信が重複しています」

① オプション 1: 非表示フィールドを 1 つだけ指定します: 、実現不可能、理由: //クリアマーク: 固定リクエストパラメータをクリアする方法はありません

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 }
ログイン後にコピー

② オプション 2: リクエストにタグを入れます。機能しません。フォーム ページが更新された後、リクエストは破棄されているため、フォームの送信は新しいリクエストになります

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 }
ログイン後にコピー

③ オプション 3: タグをセッションに挿入します。

hiddenfields

setattributedomainvaluesを使用できます 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. まとめ

1)ヘビーを使う指示されたメソッドは、フォーム送信の問題の一部を解決できます。

2) セッションを通じて属性フィールドと非表示フィールドを組み合わせることで、フォームの繰り返し送信を防ぎます。

関連記事:

PHP フォームの繰り返し送信の問題を解決する方法、PHP フォームの繰り返し送信

javascript - PHP は更新ページ フォームの繰り返し送信の問題をどのように解決しますか??

関連ビデオ:

JS 開発検証フォームのチュートリアル

以上がJavaweb ラーニング セッションの事例: フォームの繰り返し送信を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート