mashiguang

          小馬快跑

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

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

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

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

          看代碼。

          首先是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中進(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) 評論(6)  編輯  收藏 所屬分類: java web開發(fā)

          評論

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

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

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

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

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

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

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

          主站蜘蛛池模板: 涟源市| 金寨县| 普格县| 师宗县| 潢川县| 贵州省| 乌恰县| 石家庄市| 长乐市| 梧州市| 平昌县| 邵阳县| 泸定县| 田阳县| 永嘉县| 金平| 奉节县| 仙桃市| 稷山县| 从江县| 郓城县| 浑源县| 广汉市| 普洱| 浮梁县| 沙雅县| 永安市| 潢川县| 榆社县| 漯河市| 邛崃市| 大荔县| 昔阳县| 涟水县| 江陵县| 通许县| 永康市| 大庆市| 海盐县| 鸡西市| 乡宁县|