淺談利用Session防止表單重復(fù)提交
解決項(xiàng)目中表單重復(fù)提交的問題,在平常的項(xiàng)目中有以下幾種可能出現(xiàn)表單重復(fù)提交的情況,比如說:
1.由于服務(wù)器緩慢或者網(wǎng)絡(luò)延遲的原因,重復(fù)點(diǎn)擊提交按鈕
2.已經(jīng)提交成功,但是還不停刷新成功頁面
3.已經(jīng)提交成功,通過回退,再次點(diǎn)擊提交按鈕。
這些情況都可能使數(shù)據(jù)庫中產(chǎn)生過多相同的冗余數(shù)據(jù),浪費(fèi)數(shù)據(jù)庫資源。只有轉(zhuǎn)發(fā)才會出現(xiàn),重定向則不會。
針對第一種情況的解決方案(使用JavaScript),對后面兩種無效:
首先在頁面中添加如下格式的JavaScript代碼
var submitFlag=false; function checksubmit(){ if(!submitFlag){ submitFlag=true; document.forms[0].submit(); } }
(1)當(dāng)提交按鈕的type屬性為button時:
設(shè)置按鈕的onClick=”checksubmit();”即可。
(2)當(dāng)提交按鈕的type屬性為submit時:
設(shè)置按鈕的onClick=”checksubmit();”,并在<form>標(biāo)簽中增加onsubmit=”returnfalse”。因?yàn)閟ubmit按鈕的自動提交時在點(diǎn)擊事件提交之后,將onsubmit設(shè)置為”returnfalse”,submit按鈕的自動提交就會失效。
對于后面兩種情況,可以使用session解決,其原理是在運(yùn)行添加信息頁面時在session中放置信息,然后頁面提交信息給servlet處理,servlet獲取session中的信息,如果session中有信息不為空則將信息插入數(shù)據(jù)庫,然后刪除session中的信息,下次再提交表單時session中的信息為空,那么則不執(zhí)行存儲信息過程。
但是單純使用session有其局限性,所以在實(shí)際開發(fā)中,一般使用利用session結(jié)合UUID解決表單的重復(fù)提交,代碼如下:
定義一個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生成一個唯一的標(biāo)識號,賦給隱藏域,把唯一的標(biāo)識號 放置到session中一份,代碼如下:
<input type="hidden" name="html.uuid" value='<%=UuidToken.getUuidToken().getUUIDAsStr(request)%>'>
提交給servlet后,獲取 jsp頁隱藏域的值,用隱藏域的值和session中放置的值做比對,如果相同,保存數(shù)據(jù)并從session中刪除UUID,不相同則說明是重復(fù)提交,不進(jìn)行處理。
Boolean flag= UuidToken.getUuidToken().isUUIDValidate(request); if(flag){ // 保存信息到數(shù)據(jù)庫 //從session刪除uuid的 UuidToken.getUuidToken().resetUUID(request); } else{ System.out.println("表單重復(fù)提交"); }
總結(jié)
以上就是本文關(guān)于淺談利用Session防止表單重復(fù)提交的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
相關(guān)文章
java如何實(shí)現(xiàn)獲取客戶端ip地址的示例代碼
本文主要介紹了java如何實(shí)現(xiàn)獲取客戶端ip地址,主要包括java獲取客戶端ip地址工具類使用實(shí)例、應(yīng)用技巧,文中通過示例代碼介紹的非常詳細(xì),感興趣的小伙伴們可以參考一下2022-04-04mybatis 集合嵌套查詢和集合嵌套結(jié)果的區(qū)別說明
這篇文章主要介紹了mybatis 集合嵌套查詢和集合嵌套結(jié)果的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09java使用JDBC連接數(shù)據(jù)庫的五種方式(IDEA版)
這篇文章主要介紹了java使用JDBC連接數(shù)據(jù)庫的五種方式(IDEA版),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04mybatis自定義參數(shù)類型轉(zhuǎn)換器數(shù)據(jù)庫字段加密脫敏
這篇文章主要為大家介紹了mybatis自定義參數(shù)類型轉(zhuǎn)換器數(shù)據(jù)庫字段加密脫敏,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09SpringBoot教程_創(chuàng)建第一個SpringBoot項(xiàng)目
這篇文章主要介紹了SpringBoot教程_創(chuàng)建第一個SpringBoot項(xiàng)目,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06SpringBoot JSON全局日期格式轉(zhuǎn)換器實(shí)現(xiàn)方式
這篇文章主要介紹了SpringBoot JSON全局日期格式轉(zhuǎn)換器,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-04-04詳解java一維數(shù)組及練習(xí)題實(shí)例
在本篇文章里小編給大家整理了關(guān)于java一維數(shù)組及練習(xí)題的相關(guān)知識點(diǎn)和實(shí)例代碼,有需要的朋友們跟著學(xué)習(xí)下。2019-07-07使用java實(shí)現(xiàn)網(wǎng)絡(luò)爬蟲
這篇文章主要介紹了使用java實(shí)現(xiàn)網(wǎng)絡(luò)爬蟲,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07