java 防止表單重復提交

防止表單重復提交,或者是防止按F5 刷新提交表單。

在WEB開發中是經常會碰到這樣的問題的。

目前主流的解決方法有以下三種:

1、采用腳本來解決

2、重定向到別的頁面

3、使用s:token 標簽

由于我是使用S2SH來開發的,所以就選擇了第三種方法。

先簡單的解釋下<s:token /> 這個標簽,<s:token>就是為了防止Struts2中表單重復提交的。他的實現類是org.apache.struts2.views.jsp.ui.TokenTag,繼承于org.apache.struts2.views.jsp.ComponentTagSupport。

TokenTag ComponentTagSupport.doStartTag 將控件對象化
TokenTag ComponentTagSupport.doEndTag component.end 調用component(Token)
Token 繼承自org.apache.struts2.components.UIBean,因此首先調用UIBean.end方法,在UIBean.end方法中最后一句調用定義為protected的方法evaluateExtraParams,這個方法是提供給UIBean的子類擴展使用的,在Token的evaluateExtraParams方法中
String token = buildToken(tokenName);
其中buildToken方法實際上調用的是 TokenHelper.setToken方法,在setToken方法中值得注意的是兩點,
1、 generateGUID()方法,此方法是生成Token值得算法所在
2 、session.put(tokenName, token)可以看到此處將生成的值存儲在session中,等待以后比對。

生成guid后,token攔截器會判斷客戶端form提交的token和session中保存的session是否equals。如果equals則執行Action。否則攔截器直接返回invaid.token結果,Action對應的方法也不會執行

所以我解決的方法是:

1、前臺jsp 表單在提交(</form>)之前,加入<s:token />標簽,action中不需要做修改。

2、在配置文件中做如下的配置就可以了

[java]view plaincopy
  1. <actionname="generateChoose"class="com.fzdna.application.agent.actions.admin.manager.numberManager.ChooseNumberAction"
  2. method="generateChoose">
  3. <interceptor-refname="defaultStack"/>
  4. <interceptor-refname="token"/>
  5. <resultname="success">/admin/manager/numberManager/generateChooseNumber.jsp</result>
  6. <resultname="error">/admin/manager/numberManager/generateChooseNumber.jsp</result>
  7. <resultname="invalid.token"type="redirect">generateChooseNumber.do</result>
  8. </action>

這樣就可以防止表單重復提交。

再簡單說下采用腳本控制,這中方式本來就存在缺陷,如果客服端禁止使用腳本,即使你的腳本寫的再好,也是白費。個人建議還是在服務器端進行控制。

前臺jsp頁面:

<form action="duplicateAction.do" method="post" οnsubmit="return checkSubmit();"></form>

js 代碼如下:

[javascript]view plaincopy
  1. <mce:scriptlanguage="javascript"><!--
  2. varcheckSubmitFlag=false;
  3. functioncheckSubmit(){
  4. if(checkSubmitFlag==true){
  5. returnfalse;
  6. }
  7. checkSubmitFlag=true;
  8. returntrue;
  9. }
  10. document.οndblclick=functiondocondblclick(){
  11. window.event.returnValue=false;
  12. }
  13. document.οnclick=functiondoconclick(){
  14. if(checkSubmitFlag){
  15. window.event.returnValue=false;
  16. }
  17. }
  18. //--></mce:script>

至于跳到中轉頁面,也就是在表單提交的時候跳轉到一個中轉的jsp頁面即可。

借助于網上達人的意見,及個人的體會,簡單總結下。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444130.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444130.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444130.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

貪吃蛇源代碼111

#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h> #include <time.h> const int H 8; //地圖的高 const int L 16; //地圖的長 char GameMap[H][L]; //游戲地圖 int key; //按鍵保存 int sum 1, over 0; //蛇…

劍指offer:26-30記錄

輸入兩棵二叉樹A和B&#xff0c;判斷B是不是A的子結構。(約定空樹不是任意一個樹的子結構) B是A的子結構&#xff0c; 即 A中有出現和B相同的結構和節點值。 例如: 給定的樹 A: 3 / \ 4 5 / \ 1 2 給定的樹 B&#xff1a; 4 / 1 返回 true&#xff0c;因為…

Calendar類 set方法 get方法 add方法

Calendar類 set方法 get方法 add方法 package asd; import java.util.*; public class zixue { public static void main(String[] args) { demo01();//實驗的是get()方法&#xff1b; demo02();//實驗的是set()方法&#xff1b; } //---------------------------------------…

劍指offer:31-32記錄(4道)

輸入兩個整數序列&#xff0c;第一個序列表示棧的壓入順序&#xff0c;請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如&#xff0c;序列 {1,2,3,4,5} 是某棧的壓棧序列&#xff0c;序列 {4,5,3,2,1} 是該壓棧序列對應的一個彈出序列&#xff0c;但…

炸窩Vector簡介

/** 1.Vector的介紹&#xff1a;* Vector<E>是所有單列集合的鼻祖&#xff0c;但是在JAVA1.2版本之后就被Collection集合所替代&#xff0c;Vector可以實現可增長的對象數組* 與數組一樣&#xff0c;它包含可以使用整數索引進行訪問的組件* 但是它的大小可以根據需要增加…

劍指offer:33-37記錄

輸入一個整數數組&#xff0c;判斷該數組是不是某二叉搜索樹的后序遍歷結果。如果是則返回 true&#xff0c;否則返回 false。假設輸入的數組的任意兩個數字都互不相同。 參考以下這顆二叉搜索樹&#xff1a; 5 / \ 2 6 / \ 1 3 示例 1&#xff1a; 輸入: [1,6,…

劍指offer:39-42記錄

數組中有一個數字出現的次數超過數組長度的一半&#xff0c;請找出這個數字。 你可以假設數組是非空的&#xff0c;并且給定的數組總是存在多數元素。 示例 1: 輸入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 輸出: 2 限制&#xff1a; 1 < 數組長度 < 50000 思路&#xff1a;…

炸窩哈希值的原理

package asdfg; import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class aaa { public static void main(String[] args) {/*** 小提示&#xff1a;* 1.對于所有沒有索引的方法&#xff0c;我們都不能使用for循環進行遍歷* 2.提到接口&am…

劍指offer:45-48記錄

輸入一個正整數數組&#xff0c;把數組里所有數字拼接起來排成一個數&#xff0c;打印能拼接出的所有數字中最小的一個。 示例 1: 輸入: [10,2] 輸出: "102" 示例 2: 輸入: [3,30,34,5,9] 輸出: "3033459" 提示: 0 < nums.length < 100 說明:…

炸窩(可變函數)

可變函數源碼理解&#xff1a;學生角度&#xff0c;更易操作 public static void main(String[] args) {/*int cadd(10,29);System.out.println(c);*///此時可以隨意的進行數據的傳遞add(20,30,40);//[I1db9742:解釋&#xff0c;中括號代表是一個數組&#xff0c;為一個地址值…

劍指offer:50-53記錄

在字符串 s 中找出第一個只出現一次的字符。如果沒有&#xff0c;返回一個單空格。 示例: s "abaccdeff" 返回 "b" s "" 返回 " " 限制&#xff1a; 0 < s 的長度 < 50000 思路&#xff1a;map記錄次數&#xff0c;再…

Eclipse安裝插件的幾種方式

前段時間Google轉向了IDEA&#xff0c;貌似有些動搖了Eclipse作為Java領域IDE龍頭老大的位置&#xff0c;為此引起了Eclipse粉絲和IDEA粉絲的集體罵戰。類似這種罵戰向來都不絕于耳&#xff0c;貌似程序員的都比較多&#xff0c;可能大家都是搞技術出身&#xff0c;都很自信。其…

炸窩(Collections當中的addAll方法)

public class aaa { public static void main(String[] args) {/** java.util.Collections是集合工具類&#xff0c;用來對集合進行操作&#xff0c;* * 集合Collections當中的兩個方法&#xff1a;* 1.addAll方法&#xff1a;因為是靜態方法&#xff0c;嗯所以可以.直接吹風機…

劍指offer:55-58記錄

輸入一棵二叉樹的根節點&#xff0c;求該樹的深度。從根節點到葉節點依次經過的節點&#xff08;含根、葉節點&#xff09;形成樹的一條路徑&#xff0c;最長路徑的長度為樹的深度。 例如&#xff1a; 給定二叉樹 [3,9,20,null,null,15,7]&#xff0c; 3 / \ 9 20 …

Map集合知識點(炸窩)

/** * 簡單的介紹一下我們接下來準備學習的集合MAP集合 * * Map集合的簡單概述&#xff1a; * 其中的健是不能進行重復的&#xff0c;而且每一健只能映射一個值&#xff0c;簡單的說就是K與V是一一對應的&#xff0c;不能有其他的關系&#xff0c; * 但是我們注意到value值是可…

劍指offer:63-66記錄

假設把某股票的價格按照時間先后順序存儲在數組中&#xff0c;請問買賣該股票一次可能獲得的最大利潤是多少&#xff1f; 示例 1: 輸入: [7,1,5,3,6,4] 輸出: 5 解釋: 在第 2 天&#xff08;股票價格 1&#xff09;的時候買入&#xff0c;在第 5 天&#xff08;股票價格 6&a…

【大總結3】leetcode解題總覽(算法、劍指offer、SQL、多線程、shell)

3/22更新 劍指offer 題目鏈接 建議大部分題都會做&#xff0c;都能比較快速且準確的寫出來。關于做題方式&#xff0c;我的建議是&#xff1a;一道一道刷即可&#xff0c;因為難度一般&#xff0c;不用系統的學習什么知識&#xff0c;遇到實在不會的就跳過即可。 我這里寫了…

逆序存儲【數據結構】

C語言中malloc是動態內存分配函數。 函數原型&#xff1a;void malloc(unsigned int num_bytes); 參數&#xff1a;num_bytes 是無符號整型&#xff0c;用于表示分配的字節數。 返回值&#xff1a;如果分配成功則返回指向被分配內存的指針(此存儲區中的初始值不確定)&#xff0…

為什么 main 方法是 public static void ?

main 方法是我們學習Java編程語言時知道的第一個方法&#xff0c;你是否曾經想過為什么 main 方法是 public、static、void 的。當然&#xff0c;很多人首先學的是C和C&#xff0c;但是在Java中main方法與前者有些細微的不同&#xff0c;它不會返回任何值&#xff0c;為什么 ma…

返回地址【數據結構】

小問題&#xff1f; 1.我們是如何根據地址值來找到我們對應的數據的&#xff1f; 詳細陳述一下&#xff1a;當我們開辟一個整數類型&#xff0c;取名為a&#xff0c;假設地址空間是從數值為2000進行存儲&#xff0c;并且我們假設整形占用4個字節&#xff0c;那么我們在內存中需…