使用Token可以防止當用戶刷新頁面和點擊後退按鈕時造成的頁面表單重複提交的問題:
使用方法如下:
(1)
首先要通過一個頁面生成一個Token令牌,生成一個隨機數
可以創建一個頁面main.jsp
然後在該頁面上放置一個按鈕或者超連接 ,該超連接指向一個action類
在這個action類中使用
this.saveToken(request); //生成Token
Globals s;
return mapping.findForward("success"); //跳轉到增加頁面
(2)
在--增加頁面--中導入如下兩個jar包
<%@ page import="org.apache.struts.taglib.html.Constants" %>
<%@ page import="org.apache.struts.Globals" %>
然後在頁面上添加一個隱藏域
<input type="hidden" name="<%=Constants.TOKEN_KEY%>" value="<%=session.getAttribute(Globals.TRANSACTION_TOKEN_KEY)%>"/>
此處的name value中的值都是固定的,不允許改變
(3)
在---AddUserAction-----中,使用isTokenValid(request)驗證Token,如果產生的Token令牌隨機數不同,則
跳轉到錯誤頁面,如果相同則把session中的Token刪除,然後進行業務處理
if (!this.isTokenValid(request)) {
return mapping.findForward("error");
}
this.resetToken(request);
//之後跟業務代碼
注意:
Hidden的名稱必須爲Constants.TOKEN_KEY
Hidden的值必須爲session.getAttribute(Globals.TRANSACTION_TOKEN_KEY)
頁面重複提交解決方法
方法1:提交後重定向到新頁面
<forward name=“ok" path="/ok.jsp" redirect="true" />
將redirect="true"設置爲true;
優點:可以防止用戶點“刷新”重新提交
缺點:不能防止用戶點“後退”後重新提交
方法2:使用Struts提供的Token機制
類似於看電影,先買票,入場之前需要驗票
優點;“刷新”、“後退”兩種方式都能避免
缺點:實現起來稍微有點麻煩