談笑有鴻儒,往來無白丁

          在恰當?shù)臅r間、地點以恰當?shù)姆绞奖磉_給恰當?shù)娜?..  閱讀的時候請注意分類,佛曰我日里面是談笑文章,其他是各個分類的文章,積極的熱情投入到寫博的隊伍中來,支持blogjava做大做強!向dudu站長致敬>> > 我的微博敬請收聽

          前幾天被這個問題困擾了,在Google中搜“表單重復提交”,也搜到不少資料,但有的講的不是很清楚,所以走了些彎路,現(xiàn)在寫下來,不能算原創(chuàng)吧。


          Struts的Token(令牌)機制能夠很好的解決表單重復提交的問題,基本原理是:服務器端在處理到達的請求之前,會將請求中包含的令牌值與保存在當前用戶會話中的令牌值進行比較,看是否匹配。在處理完該請求后,且在答復發(fā)送給客戶端之前,將會產(chǎn)生一個新的令牌,該令牌除傳給客戶端以外,也會將用戶會話中保存的舊的令牌進行替換。這樣如果用戶回退到剛才的提交頁面并再次提交的話,客戶端傳過來的令牌就和服務器端的令牌不一致,從而有效地防止了重復提交的發(fā)生。


          這時其實也就是兩點,第一:你需要在請求中有這個令牌值,請求中的令牌值如何保存,其實就和我們平時在頁面中保存一些信息是一樣的,通過隱藏字段來保存,保存的形式如: 〈input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="6aa35341f25184fd996c4c918255c3ae"〉,這個value是TokenProcessor類中的generateToken()獲得的,是根據(jù)當前用戶的session id和當前時間的long值來計算的。第二:在客戶端提交后,我們要根據(jù)判斷在請求中包含的值是否和服務器的令牌一致,因為服務器每次提交都會生成新的Token,所以,如果是重復提交,客戶端的Token值和服務器端的Token值就會不一致。下面就以在數(shù)據(jù)庫中插入一條數(shù)據(jù)來說明如何防止重復提交。


          在Action中的add方法中,我們需要將Token值明確的要求保存在頁面中,只需增加一條語句:saveToken(request);,如下所示:
          public ActionForward add(ActionMapping mapping, ActionForm form,
          HttpServletRequest request, HttpServletResponse response)
          //前面的處理省略
          saveToken(request);
          return mapping.findForward("add");
          }
          在Action的insert方法中,我們根據(jù)表單中的Token值與服務器端的Token值比較,如下所示:
          public ActionForward insert(ActionMapping mapping, ActionForm form,
          HttpServletRequest request, HttpServletResponse response)
          if (isTokenValid(request, true)) {
          // 表單不是重復提交
          //這里是保存數(shù)據(jù)的代碼
          } else {
          //表單重復提交
          saveToken(request);
          //其它的處理代碼
          }
          }

          posted on 2006-09-10 20:29 壞男孩 閱讀(316) 評論(0)  編輯  收藏 所屬分類: java命令學習
          主站蜘蛛池模板: 泸水县| 丹棱县| 马公市| 团风县| 河源市| 邮箱| 历史| 宜阳县| 白水县| 丰城市| 云龙县| 康平县| 蒙山县| 昭通市| 宁安市| 浙江省| 郑州市| 方城县| 栾川县| 桑植县| 竹山县| 佳木斯市| 延吉市| 库车县| 宁南县| 洪雅县| 利川市| 淄博市| 张家港市| 霍林郭勒市| 驻马店市| 溧水县| 满城县| 榕江县| 宁海县| 陆河县| 深水埗区| 政和县| 澜沧| 三门县| 大冶市|