資源描述:
《struts的重復(fù)提交問題》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、重復(fù)提交、重復(fù)刷新、防止后退的問題以及處理方式兩種方法都是可行的1.使用token2.forward設(shè)置redirect=true一。前言你在任何一個比較專業(yè)的BBS都會看到這樣的問題,即使你Google一下,也會發(fā)現(xiàn)有很多的人在關(guān)注和詢問,但大家給出的解決方法卻都是千差萬別,(有的人主張采用腳本來解決;有的則想重定向到別的頁面;有的則將此問題提升到Token的角度)為什么會有如此大的差異呢?二。問題場景首先,我們應(yīng)該先了解為什么要處理這樣的問題?或者專業(yè)一點就是它適合的場景是什么?(似乎只有人來問沒有人
2、來解釋)1。重復(fù)提交、重復(fù)刷新的場景重復(fù)提交、重復(fù)刷新都是來解決系統(tǒng)重復(fù)記錄的問題。也就是說某個人在多次的提交某條記錄(為什么?也許是閑了沒有事情干的;最有可能是用戶根本就不知道自己的提交結(jié)果是否已經(jīng)執(zhí)行了??。5霈F(xiàn)了這樣的問題并不見得就必須處理,要看你所開發(fā)的系統(tǒng)的類別而定。比如你接手的是某個資源管理系統(tǒng),系統(tǒng)本身從需求的角度根本就不允許出現(xiàn)"重復(fù)"的記錄,在這樣需求的約束條件下,去執(zhí)行重復(fù)的提交動作只會引發(fā)“業(yè)務(wù)級異常”的產(chǎn)生,根本就不可能執(zhí)行成功也就無所謂避免不避免的問題了。?2。防止后退的場景
3、了解了重復(fù)刷新、重復(fù)提交的場景,我們來了解一下"防止后退"操作的原因是什么?比如你在開發(fā)某個投票系統(tǒng),它有很多的步驟,并且這些步驟之間是有聯(lián)系的,比如第一步會將某些信息發(fā)送給第二步,第二步緩存了這些信息,同時將自身的信息發(fā)送給了第三步。。。。。等等,如果此時用戶處在第三步驟下,我們想象一下某個淘氣用戶的用戶點擊了后退按鈕,此時屏幕出現(xiàn)了第二步驟的頁面,他再次的修改或者再次的提交,進入到下一個步驟(也就是第三步驟),錯誤就會在此產(chǎn)生?!什么錯誤呢?最為典型的就是這樣的操作直接導(dǎo)致了對于第一個步驟信息的丟失!
4、(如果這樣的信息是依靠Request存放的話,當然你可以存放在Session或者更大的上下文環(huán)境中,但這不是個好主意!關(guān)于信息存放的問題,下次在就這個問題詳細的討論)三。如何處理的問題當然很多的系統(tǒng)(比如訂票系統(tǒng)從需求上本身是允許個人重復(fù)訂票的)是必須要避免重復(fù)刷新、重復(fù)提交、以及防止后退的問題的,但即使是這樣的問題,也要區(qū)分如何處理以及在哪里處理的(網(wǎng)上只是告訴你如何處理,但很少去區(qū)分在哪里處理的),顯然處理的方式無非是客戶端或者服務(wù)器端兩種,而面對不同的位置處理的方式也是不同的,但有一點要事先聲明:任
5、何客戶端(尤其是B/S端)的處理都是不可信任的,最好的也是最應(yīng)該的是服務(wù)器端的處理方法。客戶端處理:面對客戶端我們可以使用Javascript腳本來解決,如下1。重復(fù)刷新、重復(fù)提交WaysOne:設(shè)置一個變量,只允許提交一次。???varcheckSubmitFlg=false;???functioncheckSubmit(){?????if(checkSubmitFlg==true){????????returnfalse;?????}?????
6、checkSubmitFlg=true;?????returntrue;??}??document.ondblclick=functiondocondblclick(){???window.event.returnValue=false;??}??document.onclick=functiondoconclick(){??????if(checkSubmitFlg){????????window.event.returnValue=false;??????}??}7、action="myAction.do"method="post"onsubmit="returncheckSubmit();">WayTwo:將提交按鈕或者image置為disable????8、gif"border="0"/>?
?2。防止用戶后退這里的方法是千姿百態(tài),有的是更改瀏覽器的歷史紀錄的,比如使用window.history.forward()方法;有的是“用新頁面的URL替換當前的歷史紀錄,這樣瀏覽歷史記錄中就只有一個頁面,后退按鈕永遠不會變?yōu)榭捎??!北热缡褂胘avascript:location.replace(this.href);event.returnValue=false;