用同步器令牌來防止客戶端的重復提交,這的確是個好注意!
特別是防止用戶在瀏覽器當中點擊后退或者刷新按鈕所產生的不良影響。
道理其實很簡單,大概流程為:輸入請求-->比較值-->處理請求-->生成令牌-->保存令牌-->
準備響應-->外發響應。
在客戶請求當中攜帶服務器前一次響應時發給客戶端的令牌,去與服務器端保存的令牌相比較,如果相等,則說明當前是合法提交。而不過不匹配,則可能是重復提交了。
在具體的實現當中以jsp為例,在控制器當中采用servlet來負責管理令牌,將服務器端的令牌保存在session當中,通過每次的請求來更新這個令牌。然后在將要處理的業務邏輯之前判斷提交上來的令牌是否合法。如果合法則繼續執行,如果不合法,則避免執行正常的操作。
servlet當中生成token代碼可如下:

public void saveToken(HttpServletRequest request)
{
HttpSession session=request.getSession();
String token=generateToken(request);
session.setAttribute(Constants.TOKEN,token);
}檢查令牌合法性

public boolean isTokenValid(HttpServletRequest request)
{
HttpSession session=request.getSession();
String saved=session.getAttribute(Constants.TOKEN);
String token=request.getParameter(Constants.TOKEN);

if(saved.equals(token))
{
return true;
}
return false;
}
在JSP端,通過助手類將當前生成的令牌保存在HTML的表單的隱含域當中。
比如
<input type="hidden" name="TOKEN" value="as8d7j3sk">
通過這種手段實現起來并不十分復雜。當然這只是防止用戶提交的手段之一。其他的方法有待大家不斷補充。
來源參考:Core J2ee patterns 2
特別是防止用戶在瀏覽器當中點擊后退或者刷新按鈕所產生的不良影響。
道理其實很簡單,大概流程為:輸入請求-->比較值-->處理請求-->生成令牌-->保存令牌-->
準備響應-->外發響應。
在客戶請求當中攜帶服務器前一次響應時發給客戶端的令牌,去與服務器端保存的令牌相比較,如果相等,則說明當前是合法提交。而不過不匹配,則可能是重復提交了。
在具體的實現當中以jsp為例,在控制器當中采用servlet來負責管理令牌,將服務器端的令牌保存在session當中,通過每次的請求來更新這個令牌。然后在將要處理的業務邏輯之前判斷提交上來的令牌是否合法。如果合法則繼續執行,如果不合法,則避免執行正常的操作。
servlet當中生成token代碼可如下:




















在JSP端,通過助手類將當前生成的令牌保存在HTML的表單的隱含域當中。
比如

通過這種手段實現起來并不十分復雜。當然這只是防止用戶提交的手段之一。其他的方法有待大家不斷補充。
來源參考:Core J2ee patterns 2