您好,登錄后才能下訂單哦!
解決項目中表單重復提交的問題,在平常的項目中有以下幾種可能出現表單重復提交的情況,比如說:
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防止表單重復提交的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。