mashiguang

          小馬快跑

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            20 隨筆 :: 0 文章 :: 60 評(píng)論 :: 0 Trackbacks

          貼子轉(zhuǎn)自http://hi.baidu.com/bobylou,轉(zhuǎn)之前并沒有驗(yàn)證文章里的方法是不是有效,估計(jì)原作者把它放到blog之前應(yīng)該做過測(cè)試了吧。

          Struts本身有一套完善的防止重復(fù)提交表單Token(令牌)機(jī)制,但筆者目前的項(xiàng)目自寫的framework沒有用到Struts,故也得自寫防止用戶因?yàn)楹笸嘶蛘咚⑿聛碇貜?fù)提交表單內(nèi)容的Token機(jī)制。不難,容易實(shí)現(xiàn)。

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

          看代碼。

          首先是Token主類。類很簡(jiǎn)單,而且主要方法都給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中進(jìn)行檢驗(yàn)。

           

          if(Token.isTokenStringValid(request.getParameter(Token.TOKEN_STRING_NAME), request.getSession())){
          //進(jìn)行正常業(yè)務(wù)流程
          }

          else{
          //進(jìn)行防重復(fù)提交處理流程
          }

          完畢。

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

          評(píng)論

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

          你的程序有問題  回復(fù)  更多評(píng)論
            

          # re: ,防止刷新/后退引起的重復(fù)提交問題的Java Token代碼,非Struts 2008-03-06 20:59 mashiguang
          不好意思,我轉(zhuǎn)的時(shí)候沒有驗(yàn)證.  回復(fù)  更多評(píng)論
            

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

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

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

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

          主站蜘蛛池模板: 襄汾县| 宜丰县| 天气| 龙海市| 泾源县| 武城县| 稻城县| 广平县| 宕昌县| 乌什县| 平乐县| 屯昌县| 济宁市| 双牌县| 石楼县| 城固县| 安吉县| 东宁县| 息烽县| 城市| 安乡县| 平泉县| 武鸣县| 兴安盟| 于都县| 水富县| 宁晋县| 万荣县| 上饶市| 乐平市| 三门峡市| 三穗县| 昭觉县| 丰都县| 弥渡县| 沙坪坝区| 益阳市| 蓬莱市| 绥棱县| 嘉义县| 得荣县|