表單提交, 應(yīng)該是每個(gè)網(wǎng)頁都會(huì)存在的一個(gè)內(nèi)容。比如填寫用戶信息,填寫個(gè)人資料。
向后臺(tái)傳送數(shù)據(jù)。那么可能就會(huì)有一些搗亂的用戶,或者惡意工具服務(wù)器的
他可能多次點(diǎn)擊提交按鈕。導(dǎo)致服務(wù)器需要解析多次請求
那么就會(huì)出現(xiàn)問題。增加服務(wù)器壓力。
解決方案1:
通過js ,定義一個(gè)全局變量。默認(rèn)是false,當(dāng)用戶點(diǎn)擊提交按鈕。把全局變量該為true.
當(dāng)用戶點(diǎn)擊第二次提交,會(huì)如果是true就不再執(zhí)行提交。
代碼如下
var isCommitted = false;//表單是否已經(jīng)提交標(biāo)識(shí),默認(rèn)為false
function dosubmit(){
if(isCommitted==false){
isCommitted = true;//提交表單后,將表單是否已經(jīng)提交標(biāo)識(shí)設(shè)置為true
return true;//返回true讓表單正常提交
} else {
layer.msg("您已經(jīng)提交過了,信息正在查詢請您耐心等待..")
return false;//返回false那么表單將不提交
}
}
其次需要在表單onsubmit="return dosubmit()"
用戶點(diǎn)擊提交之后默認(rèn)轉(zhuǎn)到該方法下執(zhí)行代碼
以上一種解決方案,只能解決不懂技術(shù)的,小白用戶 但是不能從根本上解決問題
還有一種方式 就是 在服務(wù)器做驗(yàn)證。這也是最佳的解決方案 (推薦使用這種方式)
這種解決方案簡單概括就是:
用戶點(diǎn)擊跳珠表單頁面,會(huì)默認(rèn)生成一個(gè)token值。token值可以是uuid+算法生成的唯一值。方式多種多樣都可以
然后把這個(gè)token值放入session中,后臺(tái)可以通過el表達(dá)式把通過key拿出token值,存入form表單中的hidden隱藏表單中
用戶每次提交,連同表單數(shù)據(jù)和這個(gè)token值發(fā)送到服務(wù)器。服務(wù)器去校驗(yàn)這個(gè)token值。
首先校驗(yàn)這個(gè)token值你要知道有幾種情況
第一種:
表單中沒有token,代表他重復(fù)叫
第二種
當(dāng)前session中沒有token,則用戶代表重復(fù)提交
第三種
存儲(chǔ)在session中的token令牌與表單Token不同,則代表用戶重復(fù)提交
每種情況都要考慮進(jìn)去,
直接干代碼??!不說廢話了
上面幾種情況 我會(huì)單獨(dú) 寫出一個(gè)工具類
/**
* 判斷客戶端提交上來的令牌和服務(wù)器端生成的令牌是否一致
* @param args
* true:表示重復(fù)提交
* false:表示沒有重復(fù)提交
*/
public static boolean isRepeatSubmit(HttpServletRequest request) {
String client_token = request.getParameter("token");
//第一種情況,如果提交表單沒有token則該用戶是重復(fù)提交表單
if (client_token == null){
return true;
}
//取出來存儲(chǔ)在session中的令牌
String server_token = (String) request.getSession().getAttribute("token");
//2、如果當(dāng)前用戶的Session中不存在Token(令牌),則用戶是重復(fù)提交了表單
if (server_token == null){
return true;
}
//3、存儲(chǔ)在Session中的Token(令牌)與表單提交的Token(令牌)不同,則用戶是重復(fù)提交了表單
if (!client_token.equals(server_token)){
return true;
}
return false;
}
2 跳轉(zhuǎn)頁面生產(chǎn)token值
//該方法主要用于跳轉(zhuǎn)JSP頁面,并且防止多次提交創(chuàng)建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 在業(yè)務(wù)層直接處理邏輯
//判斷用戶是否是重復(fù)提交
boolean b = TokenUtils.isRepeatSubmit(request);
if (b==true){
String ze = "請不要重復(fù)提交?。?!";
return ze;
}
當(dāng)業(yè)務(wù)層邏輯快執(zhí)行完時(shí)候
//移除session中的token
request.getSession().removeAttribute("token");
1.《表單提交 web防止表單多次提交的方法》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識(shí),僅代表作者本人觀點(diǎn),與本網(wǎng)站無關(guān),侵刪請聯(lián)系頁腳下方聯(lián)系方式。
2.《表單提交 web防止表單多次提交的方法》僅供讀者參考,本網(wǎng)站未對該內(nèi)容進(jìn)行證實(shí),對其原創(chuàng)性、真實(shí)性、完整性、及時(shí)性不作任何保證。
3.文章轉(zhuǎn)載時(shí)請保留本站內(nèi)容來源地址,http://f99ss.com/keji/346220.html