基本原理:
服務器端在處理到達的請求之前,會將請求中包含的令牌值與保存在當前用戶會話中的令牌值進行比較,看是否匹配。在處理完該請求后,且在答復發送給客戶端之前,將會產生一個新的令牌,該令牌除傳給客戶端以外,也會將用戶會話中保存的舊的令牌進行替換。這樣如果用戶回退到剛才的提交頁面并再次提交的話,客戶端傳過來的令牌就和服務器端的令牌不一致,從而有效地防止了重復提交的發生。
找一般的流程中插入個中間的action
多寫一個action如nonoaction
在nonoaction中
this.saveToken(request); //設置指令牌
return 跳轉到執行邏輯功能的action中如doaction
|
執行業務功能的action 如doaction
在doaction中
......
if(this.isTokenValid(request)) //如果指令牌相同
{.....
...實現功能的代碼
this.resetToken(request);//取消指令牌
}else //執行else說明提交是重復提交
{
可以跳轉回首頁.并報錯 如寫
ActionMessages errors= new ActionMessagers();
errors.add(“token”,new ActionMessages(“token”)); //可以把錯誤信息寫在資源文件中 然后顯示
this.saveErrors(return.errors); //保持錯誤信息
跳轉….
}
|