love fish大鵬一曰同風起,扶搖直上九萬里

          導航

          <2006年6月>
          28293031123
          45678910
          11121314151617
          18192021222324
          2526272829301
          2345678

          公告

          留言簿(15)

          隨筆分類(493)

          隨筆檔案(498)

          相冊

          閱讀排行榜

          常用鏈接

          統計

          積分與排名

          friends

          link

          最新評論

          Web應用中重復提交的問題的三種解決方案 (轉)

          前兩種是利用javascript,后面一種是在使用Struts的情況下的參考實現:

          1、javascript ,設置一個變量,只允許提交一次。
          <script language="javascript">
              var checkSubmitFlg = false;
              function checkSubmit()
          	{
                if (checkSubmitFlg == true)
          	  {
                   return false;
                }
                checkSubmitFlg = true;
                return true;
             }
             document.ondblclick = 
             function docondblclick()
             {
              window.event.returnValue = false;
             }
             document.onclick =
             function doconclick()
             {
                 if (checkSubmitFlg)
          	   {
                   window.event.returnValue = false;
                 }
             }
          </script>
          
          <html:form action="myAction.do" 
          method="post" onsubmit="return checkSubmit();">




          2、還是javascript,將提交按鈕或者image置為disable

          <html:form action="myAction.do" 
          method="post" 
              onsubmit="getElById('submitInput')
          	.disabled = true;
          	return true;
          	">  
            
            <html:image 
            styleId="submitInput"
            src="images/ok_b.gif" 
            border="0" />
            
            </html:form>


          3、利用struts的同步令牌機制

          利用同步令牌(Token)機制來解決Web應用中重復提交的問題,Struts也給出了一個參考實現。

          基本原理:

          服務器端在處理到達的請求之前,會將請求中包含的令牌值與保存在當前用戶會話中的令牌值進行比較,

          看是否匹配。在處理完該請求后,且在答復發送給客戶端之前,將會產生一個新的令牌,該令牌除傳給

          客戶端以外,也會將用戶會話中保存的舊的令牌進行替換。這樣如果用戶回退到剛才的提交頁面并再次

          提交的話,客戶端傳過來的令牌就和服務器端的令牌不一致,從而有效地防止了重復提交的發生。

          if (isTokenValid(request, true))
          {
            // your code here
              return mapping.findForward("success");
          } else
          {
              saveToken(request);
              return mapping.findForward
          	("submitagain");
          }


          Struts根據用戶會話ID和當前系統時間來生成一個唯一(對于每個會話)令牌的,具體實現可以參考TokenProcessor類中的generateToken()方法。

          1. //驗證事務控制令牌,會自動根據session中標識生成一個隱含input代表令牌,防止兩次提交

          2. 在action中:

          //<input type="hidden" 
          name="org.apache.struts.taglib.html.TOKEN" 
            // value="6aa35341f25184fd996c4c918255c3ae">
                 if (!isTokenValid(request))
             errors.add(ActionErrors.GLOBAL_ERROR,
          new ActionError("error.transaction.token"));
                 resetToken(request);
          	   //刪除session中的令牌


          3. action有這樣的一個方法生成令牌

          protected String generateToken
           (HttpServletRequest request)
           {
          
                 HttpSession session = 
          	   request.getSession();
                 try
          	   {
                     byte id[] = 
          		   session.getId().getBytes();
                     byte now[] =
                         new Long(System.currentTimeMillis()).
          			   toString().getBytes();
                     MessageDigest md =
          		   MessageDigest.getInstance("MD5");
                     md.update(id);
                     md.update(now);
                     return (toHex(md.digest()));
                 } catch (IllegalStateException e)
          	   {
                     return (null);
                 } catch (NoSuchAlgorithmException e)
          	   {
                     return (null);
                 }
             }

          posted on 2006-06-29 15:12 liaojiyong 閱讀(337) 評論(0)  編輯  收藏 所屬分類: Other

          主站蜘蛛池模板: 彰武县| 买车| 营山县| 通河县| 龙泉市| 赞皇县| 南部县| 博罗县| 卫辉市| 黄龙县| 紫云| 河池市| 钟山县| 新宁县| 新巴尔虎右旗| 湘阴县| 酉阳| 平安县| 武夷山市| 加查县| 桃江县| 开封市| 虹口区| 塘沽区| 宣汉县| 罗源县| 如东县| 玉林市| 乐清市| 铜川市| 厦门市| 贺州市| 易门县| 微博| 泰和县| 武威市| 唐海县| 怀柔区| 清远市| 屯昌县| 固始县|