<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    mashiguang

    小馬快跑

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

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

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

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

    首先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 閱讀(4131) 評(píng)論(6)  編輯  收藏 所屬分類: java web開(kāi)發(fā)

    評(píng)論

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

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

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

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

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

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

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

    主站蜘蛛池模板: 久久精品亚洲一区二区三区浴池 | 亚洲国产成人久久综合| 日韩精品无码一区二区三区免费| 国产成人综合亚洲亚洲国产第一页| 国产精品亚洲专区在线播放| 免费a级毛片无码av| 美女18毛片免费视频| 亚洲人成网站观看在线播放| jizz免费一区二区三区| 亚洲综合另类小说色区| 国产激情免费视频在线观看| 91亚洲va在线天线va天堂va国产 | 亚洲国产精品自在在线观看| 99精品国产成人a∨免费看| 亚洲AV成人精品网站在线播放| 59pao成国产成视频永久免费 | 一个人看的免费视频www在线高清动漫 | 亚洲三级高清免费| 亚洲色大网站WWW永久网站| 免费看美女让人桶尿口| 一级毛片视频免费观看| 亚洲av永久无码精品表情包| 精品一区二区三区无码免费视频 | 免费一区二区无码视频在线播放| 亚洲国产综合无码一区二区二三区 | 亚洲狠狠成人综合网| vvvv99日韩精品亚洲| 国产午夜精品久久久久免费视 | 2015日韩永久免费视频播放| 亚洲一线产品二线产品| 亚洲免费无码在线| 99久在线国内在线播放免费观看 | 无码永久免费AV网站| 无套内射无矿码免费看黄| 亚洲AV无码一区二区三区系列| free哆啪啪免费永久| 免费无码午夜福利片69| 亚洲视频在线观看不卡| 四只虎免费永久观看| 99re6在线视频精品免费下载| 亚洲成在人线在线播放无码 |