談笑有鴻儒,往來無白丁

          在恰當的時間、地點以恰當的方式表達給恰當的人...  閱讀的時候請注意分類,佛曰我日里面是談笑文章,其他是各個分類的文章,積極的熱情投入到寫博的隊伍中來,支持blogjava做大做強!向dudu站長致敬>> > 我的微博敬請收聽

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


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


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


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

          posted on 2006-09-10 20:29 壞男孩 閱讀(316) 評論(0)  編輯  收藏 所屬分類: java命令學習
          主站蜘蛛池模板: 黄梅县| 云和县| 合阳县| 县级市| 灵璧县| 阿克陶县| 东明县| 岐山县| 嘉禾县| 桃园县| 榆树市| 威海市| 丹寨县| 穆棱市| 五莲县| 鹿邑县| 桃源县| 湖北省| 苏尼特右旗| 呈贡县| 自治县| 日照市| 龙海市| 敖汉旗| 全州县| 赣州市| 丁青县| 江永县| 北宁市| 蓝山县| 长子县| 茂名市| 读书| 三明市| 金川县| 察哈| 邢台县| 繁昌县| 潮州市| 吴川市| 昌宁县|