'web防止表單多次提交的方法'

JSP JavaScript 算法 程序員界的彭于晏 2019-07-23
"

表單提交, 應該是每個網頁都會存在的一個內容。比如填寫用戶信息,填寫個人資料。

向後臺傳送數據。那麼可能就會有一些搗亂的用戶,或者惡意工具服務器的

他可能多次點擊提交按鈕。導致服務器需要解析多次請求

那麼就會出現問題。增加服務器壓力。

解決方案1:

通過js ,定義一個全局變量。默認是false,當用戶點擊提交按鈕。把全局變量該為true.

當用戶點擊第二次提交,會如果是true就不再執行提交。

代碼如下

<script type="text/javascript">

var isCommitted = false;//表單是否已經提交標識,默認為false

function dosubmit(){

if(isCommitted==false){

isCommitted = true;//提交表單後,將表單是否已經提交標識設置為true

return true;//返回true讓表單正常提交

} else {

layer.msg("您已經提交過了,信息正在查詢請您耐心等待..")

return false;//返回false那麼表單將不提交

}

}

</script>

其次需要在表單onsubmit="return dosubmit()"

用戶點擊提交之後默認轉到該方法下執行代碼

以上一種解決方案,只能解決不懂技術的,小白用戶 但是不能從根本上解決問題

還有一種方式 就是 在服務器做驗證。這也是最佳的解決方案 (推薦使用這種方式)

這種解決方案簡單概括就是:

用戶點擊跳珠表單頁面,會默認生成一個token值。token值可以是uuid+算法生成的唯一值。方式多種多樣都可以

然後把這個token值放入session中,後臺可以通過el表達式把通過key拿出token值,存入form表單中的hidden隱藏表單中

用戶每次提交,連同表單數據和這個token值發送到服務器。服務器去校驗這個token值。

首先校驗這個token值你要知道有幾種情況

第一種:

表單中沒有token,代表他重複叫

第二種

當前session中沒有token,則用戶代表重複提交

第三種

存儲在session中的token令牌與表單Token不同,則代表用戶重複提交

每種情況都要考慮進去,

直接幹代碼!!不說廢話了

上面幾種情況 我會單獨 寫出一個工具類

/**

* 判斷客戶端提交上來的令牌和服務器端生成的令牌是否一致

* @param args

* true:表示重複提交

* false:表示沒有重複提交

*/

public static boolean isRepeatSubmit(HttpServletRequest request) {

String client_token = request.getParameter("token");

//第一種情況,如果提交表單沒有token則該用戶是重複提交表單

if (client_token == null){

return true;

}

//取出來存儲在session中的令牌

String server_token = (String) request.getSession().getAttribute("token");

//2、如果當前用戶的Session中不存在Token(令牌),則用戶是重複提交了表單

if (server_token == null){

return true;

}

//3、存儲在Session中的Token(令牌)與表單提交的Token(令牌)不同,則用戶是重複提交了表單

if (!client_token.equals(server_token)){

return true;

}

return false;

}

2 跳轉頁面生產token值

//該方法主要用於跳轉JSP頁面,並且防止多次提交創建token

@RequestMapping(value = "findLogisticsPrice")

public String findLogistics(HttpServletRequest request, HttpServletResponse response){

String token = TokenUtils.getAccessToken(UUID.randomUUID().toString());

request.getSession().setAttribute("token", token);

return "modules/logisticsproviders/freightEstimateIndex";

}

生成token值的代碼為:

/**

* 描述:生成Token方法

* @return

*/

public static String getAccessToken(String uuid){

String key = "UZ";

String timestamp = String.valueOf(System.currentTimeMillis());

return HMACSHA256((uuid+timestamp).getBytes(),key.getBytes());

}

3 在業務層直接處理邏輯

//判斷用戶是否是重複提交

boolean b = TokenUtils.isRepeatSubmit(request);

if (b==true){

String ze = "請不要重複提交!!!";

return ze;

}

當業務層邏輯快執行完時候

//移除session中的token

request.getSession().removeAttribute("token");

"

表單提交, 應該是每個網頁都會存在的一個內容。比如填寫用戶信息,填寫個人資料。

向後臺傳送數據。那麼可能就會有一些搗亂的用戶,或者惡意工具服務器的

他可能多次點擊提交按鈕。導致服務器需要解析多次請求

那麼就會出現問題。增加服務器壓力。

解決方案1:

通過js ,定義一個全局變量。默認是false,當用戶點擊提交按鈕。把全局變量該為true.

當用戶點擊第二次提交,會如果是true就不再執行提交。

代碼如下

<script type="text/javascript">

var isCommitted = false;//表單是否已經提交標識,默認為false

function dosubmit(){

if(isCommitted==false){

isCommitted = true;//提交表單後,將表單是否已經提交標識設置為true

return true;//返回true讓表單正常提交

} else {

layer.msg("您已經提交過了,信息正在查詢請您耐心等待..")

return false;//返回false那麼表單將不提交

}

}

</script>

其次需要在表單onsubmit="return dosubmit()"

用戶點擊提交之後默認轉到該方法下執行代碼

以上一種解決方案,只能解決不懂技術的,小白用戶 但是不能從根本上解決問題

還有一種方式 就是 在服務器做驗證。這也是最佳的解決方案 (推薦使用這種方式)

這種解決方案簡單概括就是:

用戶點擊跳珠表單頁面,會默認生成一個token值。token值可以是uuid+算法生成的唯一值。方式多種多樣都可以

然後把這個token值放入session中,後臺可以通過el表達式把通過key拿出token值,存入form表單中的hidden隱藏表單中

用戶每次提交,連同表單數據和這個token值發送到服務器。服務器去校驗這個token值。

首先校驗這個token值你要知道有幾種情況

第一種:

表單中沒有token,代表他重複叫

第二種

當前session中沒有token,則用戶代表重複提交

第三種

存儲在session中的token令牌與表單Token不同,則代表用戶重複提交

每種情況都要考慮進去,

直接幹代碼!!不說廢話了

上面幾種情況 我會單獨 寫出一個工具類

/**

* 判斷客戶端提交上來的令牌和服務器端生成的令牌是否一致

* @param args

* true:表示重複提交

* false:表示沒有重複提交

*/

public static boolean isRepeatSubmit(HttpServletRequest request) {

String client_token = request.getParameter("token");

//第一種情況,如果提交表單沒有token則該用戶是重複提交表單

if (client_token == null){

return true;

}

//取出來存儲在session中的令牌

String server_token = (String) request.getSession().getAttribute("token");

//2、如果當前用戶的Session中不存在Token(令牌),則用戶是重複提交了表單

if (server_token == null){

return true;

}

//3、存儲在Session中的Token(令牌)與表單提交的Token(令牌)不同,則用戶是重複提交了表單

if (!client_token.equals(server_token)){

return true;

}

return false;

}

2 跳轉頁面生產token值

//該方法主要用於跳轉JSP頁面,並且防止多次提交創建token

@RequestMapping(value = "findLogisticsPrice")

public String findLogistics(HttpServletRequest request, HttpServletResponse response){

String token = TokenUtils.getAccessToken(UUID.randomUUID().toString());

request.getSession().setAttribute("token", token);

return "modules/logisticsproviders/freightEstimateIndex";

}

生成token值的代碼為:

/**

* 描述:生成Token方法

* @return

*/

public static String getAccessToken(String uuid){

String key = "UZ";

String timestamp = String.valueOf(System.currentTimeMillis());

return HMACSHA256((uuid+timestamp).getBytes(),key.getBytes());

}

3 在業務層直接處理邏輯

//判斷用戶是否是重複提交

boolean b = TokenUtils.isRepeatSubmit(request);

if (b==true){

String ze = "請不要重複提交!!!";

return ze;

}

當業務層邏輯快執行完時候

//移除session中的token

request.getSession().removeAttribute("token");

web防止表單多次提交的方法

"

相關推薦

推薦中...