問題描述:用戶提交表單時可能因為網速的原因,或者網頁被惡意刷新,致使同一條記錄重復插入到數據庫中,這是一個比較棘手的問題。我們可以從客戶端和服務器端一起著手,設法避免同一表單的重復提交。 解決方案:
1.使用客戶端腳本 提到客戶端腳本,經常使用的是JavaScript進行常規輸入驗證。在下面的例子中,我們使用它處理表單的重復提交問題,請看下面的代碼:
上述方法,主要是將按鈕的提交狀態改變為disabled。
2.利用Struts2的令牌機制。 防止表單重復提交主要用的到標簽是<s: token />,攔截器 <interceptor-ref name="token" />,還有一個默認的返回值<result name="invalid.token">/input.jsp</result>
在頁面加載時,<s: token />產生一個GUID(Globally Unique Identifier,全局唯一標識符)值的隱藏輸入框如: <input type="hidden" name="struts.token.name" value="struts.token"/> <input type="hidden" name="struts.token" value="BXPNNDG6BB11ZXHPI4E106CZ5K7VNMHR"/> 同時,將GUID放到會話(session)中;在執行action之前,“token”攔截器將會話token與請求token比較,如果兩者相同,則將會話中的token刪除并往下執行,否則向actionErrors加入錯誤信息。如此一來,如果用戶通過某種手段提交了兩次相同的請求,兩個token就會不同。 下面用零配置來演示 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) 評論(1) 編輯 收藏 所屬分類: Struts2
Powered by: BlogJava Copyright © 々上善若水々