基本原理:

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

找一般的流程中插入個(gè)中間的action

多寫一個(gè)actionnonoaction

nonoaction

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

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

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

doaction

......

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

{.....

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

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

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

{

可以跳轉(zhuǎn)回首頁(yè).并報(bào)錯(cuò) 如寫

ActionMessages errors= new ActionMessagers();

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

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

跳轉(zhuǎn)….

}