Token(令牌)的機(jī)制來解決重復(fù)提交
struts有自帶的Token(令牌)的機(jī)制來解決重復(fù)提交(包括后退,刷新等).舉例:假設(shè):假設(shè)有一個新增用戶的填寫表單頁面,填寫完后點擊"提交"按鈕完成數(shù)據(jù)庫錄入功能,要求不能重復(fù)提交(指類似刷新頁面的情況).此時,需要有兩個action(第一個action用來生成hidden的token值.第二個action用來校驗token值,通過判斷來決定是不是重復(fù)提交,不是則提交操作,否則提示錯誤)和至少一個頁面(保存token值和填寫用戶信息的錄入頁面)來完成校驗是否重復(fù)提交.此處有兩個頁面來完成.
為了方便,用戶表只有兩個字段用戶名<username>和密碼<password>:
具體邏輯如下:
index.jsp--鏈接--> PrepareAddUserAction.java--轉(zhuǎn)發(fā)并生成token--> addUser.jsp--提交-->
AddUserAction.java--首先校驗 '是否重復(fù)提交 ',是提示錯誤信息,不是,執(zhí)行數(shù)據(jù)庫操作.
部分相關(guān)代碼(省略formbean的代碼):
========index.jsp========
<html> <head> <title> 測試 </title> </head> <body>
<a href= " <%=request.getContextPath()%> /PrepareAddUserAction.java "> 新增用戶 </a>
</body> </html>
=========PrepareAddUserAction.java=========
package com.tseyimwah.struts.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
public class PrepareAddUserAction extends Action {
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws HibernateException {
.........//相關(guān)方法
saveToken(request); //在下一個頁面addUser.jsp生成hidden類型的token值
return mapping.findForward( "addUser ");//頁面跳轉(zhuǎn)
}
}
==========addUser.jsp=============
此處代碼沒有什么要求,含有form的普通struts頁面,代碼省略,里面的 "提交 "按紐給AddUserAction.java,即 <html:form action= "/AddUserAction.do " method= "post ">
============AddUserAction.java=====
package com.tseyimwah.struts.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
public class AddUserAction extends Action {
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws HibernateException {
//判斷token值,如果是重復(fù)提交跳轉(zhuǎn)到錯誤頁面則提示出錯信息,否則執(zhí)行相關(guān)的數(shù)據(jù)庫操作
if (!isTokenValid(request)){
request.setAttribute(GlobalKeys.MESSAGE_ID, "不允許重復(fù)提交! ");//設(shè)置出錯信息
return (mapping.findForward( "errorPage "));
} else
resetToken(request); //重新設(shè)置token值,可不用
}
......
......//其他的相關(guān)方法,如設(shè)置相關(guān)屬性值,調(diào)用相關(guān)的數(shù)據(jù)庫操作等
return (mapping.findForward( "addUserSucess "));//新增用戶成功的頁面
}
這只是將相關(guān)的必要代碼寫出,根據(jù)需要可以改寫相關(guān)的代碼.
posted on 2009-02-18 15:39 lau 閱讀(1233) 評論(0) 編輯 收藏 所屬分類: J2EE