熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

Web應用中避免Form重復提交的三種方案

2013-11-15 11:44:29  來源: JSP教程 
前兩種是利用javascript後面一種是在使用Struts的情況下的參考實現:

  javascript 設置一個變量只允許提交一次

  <script language=javascript> var checkSubmitFlg = false; function checkSubmit() { if (checkSubmitFlg == true) { return false; } checkSubmitFlg = true; return true; } documentondblclick = function docondblclick() { windoweventreturnValue = false; } documentonclick = function doconclick() { if (checkSubmitFlg) { windoweventreturnValue = false; } } </script> <html:form action=myActiondo method=post onsubmit=return checkSubmit();>



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

  <html:form action=myActiondo method=post onsubmit=getElById(submitInput) disabled = true; return true; > <html:image styleId=submitInput src=images/ok_bgif border= /> </html:form>



  利用struts的同步令牌機制

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

  基本原理

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

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

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

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

  if (isTokenValid(request true)) { // your code here return mappingfindForward(success); } else { saveToken(request); return mappingfindForward (submitagain); }



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

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

   在action中

  //<input type=hidden name=orgapaclTOKEN // value=aaffdcccae> if (!isTokenValid(request)) errorsadd(ActionErrorsGLOBAL_ERROR new ActionError(errortransactiontoken)); resetToken(request); //刪除session中的令牌



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

  protected String generateToken (HttpServletRequest request) { HttpSession session = requestgetSession(); try { byte id[] = sessiongetId()getBytes(); byte now[] = new Long(SystemcurrentTimeMillis()) toString()getBytes(); MessageDigest md = MessageDigestgetInstance(MD); mdupdate(id); mdupdate(now); return (toHex(mddigest())); } catch (IllegalStateException e) { return (null); } catch (NoSuchAlgorithmException e) { return (null); } }


From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19531.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.