中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

淺談利用Session防止表單重復提交

發布時間:2020-10-03 21:07:51 來源:腳本之家 閱讀:217 作者:amork 欄目:編程語言

解決項目中表單重復提交的問題,在平常的項目中有以下幾種可能出現表單重復提交的情況,比如說:

1.由于服務器緩慢或者網絡延遲的原因,重復點擊提交按鈕

2.已經提交成功,但是還不停刷新成功頁面

3.已經提交成功,通過回退,再次點擊提交按鈕。

這些情況都可能使數據庫中產生過多相同的冗余數據,浪費數據庫資源。只有轉發才會出現,重定向則不會。

針對第一種情況的解決方案(使用JavaScript),對后面兩種無效:

首先在頁面中添加如下格式的JavaScript代碼

 var submitFlag=false;
 function checksubmit(){
 if(!submitFlag){
  submitFlag=true;
  document.forms[0].submit(); 
  }
 }

(1)當提交按鈕的type屬性為button時:

設置按鈕的onClick=”checksubmit();”即可。

(2)當提交按鈕的type屬性為submit時:

設置按鈕的onClick=”checksubmit();”,并在<form>標簽中增加onsubmit=”returnfalse”。因為submit按鈕的自動提交時在點擊事件提交之后,將onsubmit設置為”returnfalse”,submit按鈕的自動提交就會失效。

對于后面兩種情況,可以使用session解決,其原理是在運行添加信息頁面時在session中放置信息,然后頁面提交信息給servlet處理,servlet獲取session中的信息,如果session中有信息不為空則將信息插入數據庫,然后刪除session中的信息,下次再提交表單時session中的信息為空,那么則不執行存儲信息過程。

但是單純使用session有其局限性,所以在實際開發中,一般使用利用session結合UUID解決表單的重復提交,代碼如下:

定義一個UuidToken類

public class UuidToken {
	private static UuidToken UuidToken=new UuidToken();
	private UuidToken(){
	}
	public static UuidToken getUuidToken() {
		return UuidToken;
	}
	public synchronized String getUUIDAsStr(HttpServletRequest request){
		HttpSession session=request.getSession();
		String uuidStr=UUID.randomUUID().toString();
		if(uuidStr!=null){
			session.setAttribute("session.uuid", uuidStr);
		}
		return uuidStr;
	}
	/**
 * 判斷session中保存的uuid和jsp頁面上的uuid是否相等 
 */
	public synchronized Boolean isUUIDValidate(HttpServletRequest request) {
		//獲取已存在的session 
		HttpSession session=request.getSession(false);
		if(session==null){
			return false;
		}
		String sessionuuid = (String)session.getAttribute ("session.uuid");
		if(sessionuuid==null){
			return false;
		}
		String htmluuid=request.getParameter("html.uuid");
		if(htmluuid==null){
			return false;
		}
		return sessionuuid.equals(htmluuid);
	}
	/**
 * 刪除uuid 
 */
	public synchronized void resetUUID(HttpServletRequest request) {
		HttpSession session=request.getSession(false);
		if(session==null){
			return;
		}
		session.removeAttribute("session.uuid");
	}
}

在jsp頁面增加一個隱藏域,利用uuid生成一個唯一的標識號,賦給隱藏域,把唯一的標識號 放置到session中一份,代碼如下:

<input type="hidden" name="html.uuid" value='<%=UuidToken.getUuidToken().getUUIDAsStr(request)%>'>    

提交給servlet后,獲取 jsp頁隱藏域的值,用隱藏域的值和session中放置的值做比對,如果相同,保存數據并從session中刪除UUID,不相同則說明是重復提交,不進行處理。

Boolean flag= UuidToken.getUuidToken().isUUIDValidate(request);
if(flag){
	// 保存信息到數據庫
	//從session刪除uuid的
	UuidToken.getUuidToken().resetUUID(request);
} else{
	System.out.println("表單重復提交");
}

總結

以上就是本文關于淺談利用Session防止表單重復提交的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

建瓯市| 沂水县| 资中县| 南丰县| 苍溪县| 偃师市| 松江区| 阿荣旗| 雷波县| 临清市| 白河县| 周宁县| 华亭县| 友谊县| 申扎县| 门头沟区| 揭西县| 浮山县| 湘阴县| 武川县| 万安县| 长丰县| 广水市| 佛山市| 开江县| 南漳县| 辰溪县| 宁都县| 兰西县| 涞水县| 鸡泽县| 香格里拉县| 谷城县| 广宗县| 永登县| 宽城| 伊宁市| 河南省| 双柏县| 台州市| 健康|