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