基本原理:

服務(wù)器端在處理到達(dá)的請求之前,會將請求中包含的令牌值與保存在當(dāng)前用戶會話中的令牌值進(jìn)行比較,看是否匹配。在處理完該請求后,且在答復(fù)發(fā)送給客戶端之前,將會產(chǎn)生一個新的令牌,該令牌除傳給客戶端以外,也會將用戶會話中保存的舊的令牌進(jìn)行替換。這樣如果用戶回退到剛才的提交頁面并再次提交的話,客戶端傳過來的令牌就和服務(wù)器端的令牌不一致,從而有效地防止了重復(fù)提交的發(fā)生。

找一般的流程中插入個中間的action

多寫一個actionnonoaction

nonoaction

this.saveToken(request); //設(shè)置指令牌

return 跳轉(zhuǎn)到執(zhí)行邏輯功能的action中如doaction

執(zhí)行業(yè)務(wù)功能的action doaction

doaction

......

if(this.isTokenValid(request)) //如果指令牌相同

{.....

...實現(xiàn)功能的代碼

this.resetToken(request);//取消指令牌

}else //執(zhí)行else說明提交是重復(fù)提交

{

可以跳轉(zhuǎn)回首頁.并報錯 如寫

ActionMessages errors= new ActionMessagers();

errors.add(“token”,new ActionMessages(“token”)); //可以把錯誤信息寫在資源文件中 然后顯示

this.saveErrors(return.errors); //保持錯誤信息

跳轉(zhuǎn)….

}