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 閱讀(1231) 評論(0)  編輯  收藏 所屬分類: J2EE

          主站蜘蛛池模板: 虎林市| 榆社县| 吐鲁番市| 康保县| 九龙坡区| 深泽县| 东乌珠穆沁旗| 百色市| 攀枝花市| 长沙县| 阿鲁科尔沁旗| 扬州市| 阿拉善左旗| 集贤县| 乳源| 沐川县| 嘉鱼县| 延长县| 昆山市| 漯河市| 长子县| 岱山县| 嵩明县| 涟水县| 永定县| 韩城市| 遂昌县| 长葛市| 长寿区| 改则县| 乌什县| 高碑店市| 黄浦区| 孟州市| 浦城县| 绍兴县| 红桥区| 库尔勒市| 都匀市| 滨州市| 江都市|