mashiguang

          小馬快跑

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            20 隨筆 :: 0 文章 :: 60 評論 :: 0 Trackbacks

          貼子轉自http://hi.baidu.com/bobylou,轉之前并沒有驗證文章里的方法是不是有效,估計原作者把它放到blog之前應該做過測試了吧。

          Struts本身有一套完善的防止重復提交表單Token(令牌)機制,但筆者目前的項目自寫的framework沒有用到Struts,故也得自寫防止用戶因為后退或者刷新來重復提交表單內容的Token機制。不難,容易實現。

          實現原理:一致性。jsp生成表單時,在表單中插入一個隱藏<input>字段,該字段就是保存在頁面端的token字符串,同時把該字符串存入session中。等到用戶提交表單時,會一并提交該隱藏的token字符串。在服務器端,查看下是否在session中含有與該token字符串相等的字符串。如果有,那么表明是第一次提交該表單,然后刪除存放于session端的token字符串,再做正常業務邏輯流程;如果沒有,那么表示該表單被重復提交,做非正常流程處理,可以警告提示也可以什么也不做。

          看代碼。

          首先是Token主類。類很簡單,而且主要方法都給doc注釋了

          /*
          * blog: 
          http://hi.baidu.com/bobylou
          * $Revision: 1.1 $
          * $Date: 2007/07/18 10:02:55 $
          * $Author: bobrow$
          */


          package com.paizuo.framework.util;

          import java.util.ArrayList;

          import javax.servlet.http.HttpSession;

          public class Token {

              
          private static final String TOKEN_LIST_NAME = "tokenList";

              
          public static final String TOKEN_STRING_NAME = "token";

              
          private static ArrayList getTokenList(HttpSession session) {
                 Object obj 
          = session.getAttribute(TOKEN_LIST_NAME);
                 
          if (obj != null{
                    
          return (ArrayList) obj;
                 }
           else {
                    ArrayList tokenList 
          = new ArrayList();
                    session.setAttribute(TOKEN_LIST_NAME, tokenList);
                    
          return tokenList;
                 }

              }


              
          private static void saveTokenString(String tokenStr, HttpSession session) {
                 ArrayList tokenList 
          = getTokenList(session);
                 tokenList.add(tokenStr);
                 session.setAttribute(TOKEN_LIST_NAME, tokenList);
              }

             
              
          private static String generateTokenString(){
                 
          return new Long(System.currentTimeMillis()).toString();
              }


              
          /**
               * Generate a token string, and save the string in session, then return the token string.
               * 
               * 
          @param HttpSession
               *            session
               * 
          @return a token string used for enforcing a single request for a particular transaction.
               
          */

              
          public static String getTokenString(HttpSession session) {
                 String tokenStr 
          = generateTokenString();
                 saveTokenString(tokenStr, session);
                 
          return tokenStr;
              }


              
          /**
               * check whether token string is valid. if session contains the token string, return true. 
               * otherwise, return false.
               * 
               * 
          @param String
               *            tokenStr
               * 
          @param HttpSession
               *            session
               * 
          @return true: session contains tokenStr; false: session is null or tokenStr is id not in session
               
          */

              
          public static boolean isTokenStringValid(String tokenStr, HttpSession session) {
                 
          boolean valid = false;
                 
          if(session != null){
                    ArrayList tokenList 
          = getTokenList(session);
                    
          if (tokenList.contains(tokenStr)) {
                       valid 
          = true;
                       tokenList.remove(tokenStr);
                    }

                 }

                 
          return valid;
              }

          }



          怎么使用?

          在jsp頁面端。

          首先import該類:

          <%@ page import="com.paizuo.framework.util.Token" %>

          表單包含隱藏的token字符串:

           

          <form>

          <input type="hidden" name="<%=Token.TOKEN_STRING_NAME %>" value="<%=Token.getTokenString(session) %>">

          </form>

           

          在Server端action中進行檢驗。

           

          if(Token.isTokenStringValid(request.getParameter(Token.TOKEN_STRING_NAME), request.getSession())){
          //進行正常業務流程
          }

          else{
          //進行防重復提交處理流程
          }

          完畢。

          posted on 2007-08-21 11:45 mashiguang 閱讀(4134) 評論(6)  編輯  收藏 所屬分類: java web開發

          評論

          # re: ,防止刷新/后退引起的重復提交問題的Java Token代碼,非Struts 2008-03-02 22:07 fd

          你的程序有問題  回復  更多評論
            

          # re: ,防止刷新/后退引起的重復提交問題的Java Token代碼,非Struts 2008-03-06 20:59 mashiguang
          不好意思,我轉的時候沒有驗證.  回復  更多評論
            

          # re: ,防止刷新/后退引起的重復提交問題的Java Token代碼,非Struts 2008-06-19 09:08 lovemoon@yeah.net
          謝謝您的轉帖,有思路了。  回復  更多評論
            

          # re: ,防止刷新/后退引起的重復提交問題的Java Token代碼,非Struts 2008-06-20 10:07 afsdf
          sfdafdasddsa  回復  更多評論
            

          # re: ,防止刷新/后退引起的重復提交問題的Java Token代碼,非Struts 2009-12-10 15:49 sdf
          沒問題  回復  更多評論
            

          # re: ,防止刷新/后退引起的重復提交問題的Java Token代碼,非Struts 2012-04-20 15:30 yh
          沒有問題,驗證好著呢!·  回復  更多評論
            

          主站蜘蛛池模板: 宁津县| 宁河县| 万盛区| 林口县| 长沙市| 聂荣县| 榆社县| 诸城市| 甘孜县| 鄯善县| 吉木萨尔县| 安仁县| 灌阳县| 丹阳市| 光山县| 北安市| 应用必备| 亚东县| 宝丰县| 阿克| 琼结县| 海门市| 岳普湖县| 威远县| 莲花县| 楚雄市| 达日县| 班玛县| 石狮市| 永宁县| 通许县| 娱乐| 郁南县| 民和| 剑河县| 天台县| 古蔺县| 深水埗区| 巴东县| 阳谷县| 桓台县|