問(wèn)題描述:用戶提交表單時(shí)可能因?yàn)榫W(wǎng)速的原因,或者網(wǎng)頁(yè)被惡意刷新,致使同一條記錄重復(fù)插入到數(shù)據(jù)庫(kù)中,這是一個(gè)比較棘手的問(wèn)題。我們可以從客戶端和服務(wù)器端一起著手,設(shè)法避免同一表單的重復(fù)提交。 解決方案:
1.使用客戶端腳本 提到客戶端腳本,經(jīng)常使用的是JavaScript進(jìn)行常規(guī)輸入驗(yàn)證。在下面的例子中,我們使用它處理表單的重復(fù)提交問(wèn)題,請(qǐng)看下面的代碼:
上述方法,主要是將按鈕的提交狀態(tài)改變?yōu)閐isabled。
2.利用Struts2的令牌機(jī)制。 防止表單重復(fù)提交主要用的到標(biāo)簽是<s: token />,攔截器 <interceptor-ref name="token" />,還有一個(gè)默認(rèn)的返回值<result name="invalid.token">/input.jsp</result>
在頁(yè)面加載時(shí),<s: token />產(chǎn)生一個(gè)GUID(Globally Unique Identifier,全局唯一標(biāo)識(shí)符)值的隱藏輸入框如: <input type="hidden" name="struts.token.name" value="struts.token"/> <input type="hidden" name="struts.token" value="BXPNNDG6BB11ZXHPI4E106CZ5K7VNMHR"/> 同時(shí),將GUID放到會(huì)話(session)中;在執(zhí)行action之前,“token”攔截器將會(huì)話token與請(qǐng)求token比較,如果兩者相同,則將會(huì)話中的token刪除并往下執(zhí)行,否則向actionErrors加入錯(cuò)誤信息。如此一來(lái),如果用戶通過(guò)某種手段提交了兩次相同的請(qǐng)求,兩個(gè)token就會(huì)不同。 下面用零配置來(lái)演示 token的作用 /WEB-INF/content/test-success.jsp
/WEB-INF/content/error.jsp
/WEB-INF/content/test-ok.jsp
TestAction.java
posted on 2010-12-24 16:09 々上善若水々 閱讀(3370) 評(píng)論(1) 編輯 收藏 所屬分類: Struts2
Powered by: BlogJava Copyright © 々上善若水々