迷途書童

          敏感、勤學、多思
          隨筆 - 77, 文章 - 4, 評論 - 86, 引用 - 0
          數據加載中……

          防止任意形式的重復提交

          Struts Token 機制可以解決這個問題。

          1. ? 防止通過超鏈接重復訪問 Struts Action 。

          如果我們要防止 A 的默認頁面 J 中指向 K 的超鏈接重復提交數據,按照下列步驟即可:

          a. ? 如果 J 是從 Struts Action 轉發而來,我們要在該 Struts Action execute 方法中添加下面的一行:

          ??? saveToken(request);

          b. ? 如果 J 不是從 Struts Action 轉發而來,那么新建一個 Struts Action ,在該 Struts Action excute 方法中增加上面的一行,然后再從該 action 轉到 J 頁面。

          c. ? J 頁面中使用 Struts 標簽生成指向 K 的超鏈接,如:

          ?? <html:link action="/deleteLayoutAction?layoutId=0" transaction="true" >delete</html:link>

          ?? 注意紅色字體部分。

          d. ? <html:link> 標簽指向的 action excute 方法中加入下面的代碼:

          ?? if (!isTokenValid(request)) {

          ???????????????????? return mapping.findForward(" 這種情況下就是重復提交,轉到相應的頁面 ");

          ????????????? }

          e All Done.

          2. ? 防止通過表單重復提交數據。

          a. ? 如果 J 是從 Struts Action 轉發而來,我們要在該 Struts Action execute 方法中添加下面的一行:

          ??? saveToken(request);

          b. ? 如果 J 不是從 Struts Action 轉發而來,那么新建一個 Struts Action ,在該 Struts Action excute 方法中增加上面的一行,然后再從該 action 轉到 J 頁面。

          c. ? J 頁面中表單 Action 屬性指向的 Struts action excute 方法中加入下面的代碼:

          ?? if (!isTokenValid(request)) {

          ?????????? saveToken(request);

          ???????????????????? return mapping.findForward(" 這種情況下就是重復提交,轉到相應的頁面 ");

          ?? saveToken(request);

          ????????????? }

          e All Done.

          posted on 2006-05-06 15:54 迷途書童 閱讀(2099) 評論(9)  編輯  收藏 所屬分類: java應用

          評論

          # re: 防止任意形式的重復提交  回復  更多評論   

          Struts 的 Token 機制可以解決這個問題。

          如果沒用Struts 怎么辦哇 .................. 郁悶。
          2006-05-06 17:52 | Web 2.0 技術資源

          # re: 防止任意形式的重復提交  回復  更多評論   

          可以仿照struts的token機制原理自己實現一下,very easy!
          2006-05-06 19:31 | 獨孤過客

          # re: 防止任意形式的重復提交  回復  更多評論   

          我想知道一個事情:
          使用了令牌機制之后,如果在同一個客戶端打開兩個同樣的窗口,那么豈不是新的窗口可以提交表單,舊的窗口就無法提交了呢?

          如果是這樣的話,令牌機制也不是十分完美啊,如果是在論壇里面使用的話,往往會打開若干個窗口,只有最新的一個窗口可以正確提交表單,簡直糟糕透了。
          2006-05-07 10:54 | Jonney

          # re: 防止任意形式的重復提交  回復  更多評論   

          其實還有比較難處理的情況:

          return mapping.findForward(" 這種情況下就是重復提交,轉到相應的頁面 ");

          在應用中,這個相應的頁面可能是動態的.
          比如說首次提交是成功的,那么重復提交就應該也到成功頁面.
          如果首次提交是失敗的,那么重復提交就應該也到失敗頁面.
          但是在代碼中我們只知道是重復提交,卻不知道首次提交的結果.
          所以無法決定應該轉到什么頁面.

          當然, 如果技術能夠驅動需求, 比如發生重復提交時顯示指定的頁面.
          問題可以解決.但是把技術上的問題暴露給用戶,終歸不是很友好.
          2006-05-09 07:12 | InPractice

          # re: 防止任意形式的重復提交  回復  更多評論   

          樓上說的有一定的道理,喪失一點友好性總比引起數據不一致要好得多,所謂”魚與熊掌不能兼得“
          2006-05-09 23:09 | 獨孤過客

          # re: 防止任意形式的重復提交  回復  更多評論   

          你們很強啊

          我為你們感到驕傲
          2006-05-17 00:54 | 夢游客

          # 愛我蒙古  回復  更多評論   

          bi mongl ges neen heezee ged buu maart!
          2006-07-02 05:03 | 蒙古人175866762

          # re: 防止任意形式的重復提交  回復  更多評論   

          “防止任意形式的重復提交”標題起得真好聽,可惜要用Struts 框架,建議該標題為:“利用Struts 框架,防止任意形式的重復提交”
          2006-11-23 12:25 | 被蒙騙的人

          # re: 防止任意形式的重復提交  回復  更多評論   

          使用了令牌機制之后,如果在同一個客戶端打開兩個同樣的窗口,那么豈不是新的窗口可以提交表單,舊的窗口就無法提交了呢?
          這個問題確實很鬧心。我還沒有解決掉。
          2007-05-22 08:58 | wts
          主站蜘蛛池模板: 墨竹工卡县| 松溪县| 台江县| 城口县| 丹棱县| 依兰县| 泾阳县| 辽源市| 万山特区| 张北县| 祁门县| 南昌县| 砚山县| 买车| 泾源县| 定兴县| 阜平县| 碌曲县| 安宁市| 揭西县| 烟台市| 扎赉特旗| 定西市| 韶山市| 满城县| 张家界市| 富裕县| 宜兰县| 南宁市| 香河县| 乐业县| 滨海县| 南溪县| 巍山| 信丰县| 乐至县| 临夏市| 台中市| 乡宁县| 响水县| 台山市|