thinking

          one platform thousands thinking

          Token(令牌)的機制來解決重復提交

          struts有自帶的Token(令牌)的機制來解決重復提交(包括后退,刷新等).舉例:

          假設:假設有一個新增用戶的填寫表單頁面,填寫完后點擊"提交"按鈕完成數據庫錄入功能,要求不能重復提交(指類似刷新頁面的情況).此時,需要有兩個action(第一個action用來生成hidden的token值.第二個action用來校驗token值,通過判斷來決定是不是重復提交,不是則提交操作,否則提示錯誤)和至少一個頁面(保存token值和填寫用戶信息的錄入頁面)來完成校驗是否重復提交.此處有兩個頁面來完成.

          為了方便,用戶表只有兩個字段用戶名<username>和密碼<password>:

          具體邏輯如下:

          index.jsp--鏈接--> PrepareAddUserAction.java--轉發并生成token--> addUser.jsp--提交-->
          AddUserAction.java--首先校驗 '是否重復提交 ',是提示錯誤信息,不是,執行數據庫操作.

          部分相關代碼(省略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   {
                                              .........//相關方法
                                              saveToken(request);     //在下一個頁面addUser.jsp生成hidden類型的token值
          return   mapping.findForward( "addUser ");//頁面跳轉
          }
          }

          ==========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值,如果是重復提交跳轉到錯誤頁面則提示出錯信息,否則執行相關的數據庫操作
                if   (!isTokenValid(request)){
                      request.setAttribute(GlobalKeys.MESSAGE_ID,   "不允許重復提交! ");//設置出錯信息
                      return   (mapping.findForward( "errorPage "));
                }   else
                    resetToken(request);   //重新設置token值,可不用
                }
                ......
                ......//其他的相關方法,如設置相關屬性值,調用相關的數據庫操作等
                return   (mapping.findForward( "addUserSucess "));//新增用戶成功的頁面
          }


          這只是將相關的必要代碼寫出,根據需要可以改寫相關的代碼.

          posted on 2009-02-18 15:39 lau 閱讀(1233) 評論(0)  編輯  收藏 所屬分類: J2EE

          主站蜘蛛池模板: 扎囊县| 玉龙| 湘西| 临沂市| 平罗县| 德惠市| 景谷| 彩票| 正镶白旗| 凤山县| 雅安市| 佛冈县| 英德市| 苍山县| 新邵县| 宜丰县| 城市| 谢通门县| 百色市| 湖口县| 深水埗区| 富宁县| 庐江县| 奈曼旗| 贵阳市| 砀山县| 镇雄县| 阿荣旗| 长寿区| 皋兰县| 象山县| 会理县| 辽阳县| 开封县| 苍梧县| 建水县| 札达县| 嘉义县| 镇巴县| 红原县| 长葛市|