thinking

          one platform thousands thinking

          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

          主站蜘蛛池模板: 濉溪县| 南漳县| 玉龙| 同江市| 政和县| 长寿区| 昌宁县| 微山县| 大关县| 当雄县| 车险| 海林市| 泉州市| 商都县| 万荣县| 邹城市| 宣城市| 和龙市| 澎湖县| 高雄市| 临洮县| 武陟县| 凤山市| 临泉县| 永新县| 两当县| 徐州市| 尖扎县| 东阳市| 游戏| 蓬莱市| 崇左市| 武山县| 浦江县| 沂水县| 盐边县| 凯里市| 夹江县| 习水县| 台东市| 留坝县|