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

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

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

    一、使用方法

    1、  假如你要提交的頁面為toSubmit.jsp;

    2、  在打開toSubmit.jsp的Action1中加入:saveToken(request),例如

    public ActionForward execute(

        ActionMapping mapping,

        ActionForm form,

        HttpServletRequest request,

        HttpServletResponse response)

        throws Exception {

       

            //生成同步令牌

            saveToken(request);    

     

            return mapping.findForward("toSubmit");

    }

    3、  在提交toSubmit.jsp的Action2中加入:isTokenValid(request, true),例如:

    public ActionForward execute(

        ActionMapping mapping,

        ActionForm form,

        HttpServletRequest request,

        HttpServletResponse response)

        throws Exception {

        // 驗(yàn)證同步令牌

            if (isTokenValid(request, true)) { 

                //執(zhí)行提交操作 

            }else {

                // 重復(fù)提交        

                return mapping.findForward("Error");

            }

    }

    4、  使用注意:toSubmit.jsp中的form必須使用struts的標(biāo)簽<html:form>。

     

    二、基本原理

    第一步、在session中放入同步令牌

    Action1中加入了saveToken(request)的方法后,調(diào)用TokenProcessor類的saveToken方法如下:

    public synchronized void saveToken(HttpServletRequest request) {

     

        HttpSession session = request.getSession();

        String token = generateToken(request);

        if (token != null) {

            session.setAttribute(Globals.TRANSACTION_TOKEN_KEY, token);

        }

     

    }

    很明顯在session中放入了同步令牌,名稱為Globals.TRANSACTION_TOKEN_KEY。

     

    第二步、在頁面創(chuàng)建hidden元素

    當(dāng)應(yīng)用服務(wù)器初始化toSubmit.jsp頁面遇到標(biāo)簽<html:form>時(shí),便會(huì)調(diào)用struts的FormTag類,其中有一個(gè)方法:

    protected String renderToken() {

        StringBuffer results = new StringBuffer();

        HttpSession session = pageContext.getSession();

     

        if (session != null) {

            String token =

                (String) session.getAttribute(Globals.TRANSACTION_TOKEN_KEY);

                

            if (token != null) {

                results.append("<input type=\"hidden\" name=\"");

                results.append(Constants.TOKEN_KEY);

                results.append("\" value=\"");

                results.append(token);

                if (this.isXhtml()) {

                    results.append("\" />");

                } else {

                    results.append("\">");

                }

            }

        }

     

        return results.toString();

    }

    其意為:當(dāng)檢測(cè)到session中的Globals.TRANSACTION_TOKEN_KEY不為空時(shí),在toSubmit.jsp頁面創(chuàng)建元素:

    <input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="">

    名稱為:org.apache.struts.taglib.html.TOKEN就是Constants.TOKEN_KEY;

    值為:session中的Globals.TRANSACTION_TOKEN_KEY的值,即為同步令牌值。

     

    第三步、驗(yàn)證同步令牌

    Action2中加入isTokenValid方法,實(shí)際上是調(diào)用TokenProcessor類的isTokenValid方法如下:

    public synchronized boolean isTokenValid(

        HttpServletRequest request,

        boolean reset) {

     

        // Retrieve the current session for this request

        HttpSession session = request.getSession(false);

        if (session == null) {

            return false;

        }

     

        // Retrieve the transaction token from this session, and

        // reset it if requested

        String saved = (String) session.getAttribute(Globals.TRANSACTION_TOKEN_KEY);

        if (saved == null) {

            return false;

        }

     

        if (reset) {

            this.resetToken(request);

        }

     

        // Retrieve the transaction token included in this request

        String token = request.getParameter(Constants.TOKEN_KEY);

        if (token == null) {

            return false;

        }

     

        return saved.equals(token);

    }

    它首先取得session中的令牌值,然后resetToken,再?gòu)捻撁鎕idden元素取來令牌值,進(jìn)行比較,如果相等則為第一次,不等則為重復(fù)提交。

    其中resetToken方法如下:

    public synchronized void resetToken(HttpServletRequest request) {

     

      HttpSession session = request.getSession(false);

      if (session == null) {

          return;

      }

      session.removeAttribute(Globals.TRANSACTION_TOKEN_KEY);

    }

     

    posted on 2006-03-08 21:07 野草 閱讀(2726) 評(píng)論(3)  編輯  收藏 所屬分類: 2shtv

    評(píng)論:
    # re: 使用struts的同步令牌避免form的重復(fù)提交 2006-08-10 06:18 | ll
    請(qǐng)教啊,我查看了使用isTokenValid()方法的類以及其父類都沒有導(dǎo)入TokenProcessor類,甚至都沒生成TokenProcessor對(duì)象,怎么會(huì)直接調(diào)用isTokenValid()方法呢,請(qǐng)指教  回復(fù)  更多評(píng)論
      
    # re: 使用struts的同步令牌避免form的重復(fù)提交 2006-11-09 12:28 | AK100
    首先確定導(dǎo)入了org.apache.struts包
    其次導(dǎo)入后org.apache.struts.action下就有這個(gè)方法了..  回復(fù)  更多評(píng)論
      
    # re: 使用struts的同步令牌避免form的重復(fù)提交 2008-11-05 08:08 | yangpan
    寫的真詳細(xì)。。。好像懂了!

    我去看看。。不懂再來請(qǐng)教您! 謝謝  回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 亚洲成年看片在线观看| 一个人看的www视频免费在线观看| 亚洲精品福利视频| 亚洲无线一二三四区手机| www亚洲精品少妇裸乳一区二区| 高清国语自产拍免费视频国产| 最新中文字幕免费视频| 成人毛片18女人毛片免费视频未| 中文字幕av无码无卡免费| 国产精品视频免费一区二区| 久久久久国色AV免费看图片| 插B内射18免费视频| 女人18毛片免费观看| 日本高清免费网站| 亚洲AV无码一区二三区| 免费乱码中文字幕网站| 亚洲麻豆精品国偷自产在线91| 亚洲精品人成无码中文毛片| 久久精品国产亚洲精品| 亚洲一区二区三区影院| 亚洲国产日韩一区高清在线| 亚洲高清中文字幕| 最新国产精品亚洲| 理论秋霞在线看免费| 中文在线免费观看| 18禁止看的免费污网站| 成人毛片18岁女人毛片免费看| 日本不卡高清中文字幕免费| 亚洲精品视频在线观看你懂的| 亚洲成在人线av| 亚洲熟妇色自偷自拍另类| 亚洲精品无码成人| 羞羞漫画登录页面免费| 国产中文字幕在线免费观看| 亚洲a一级免费视频| 无码免费午夜福利片在线| 免费一级肉体全黄毛片| 久久精品九九亚洲精品天堂| 亚洲精品美女久久久久9999| 亚洲色偷偷综合亚洲av78| 五月天国产成人AV免费观看|