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

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

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

    我的漫漫程序之旅

    專注于JavaWeb開(kāi)發(fā)
    隨筆 - 39, 文章 - 310, 評(píng)論 - 411, 引用 - 0
    數(shù)據(jù)加載中……

    Struts2.1 annotation防止表單重復(fù)提交

    問(wèn)題描述:用戶提交表單時(shí)可能因?yàn)榫W(wǎng)速的原因,或者網(wǎng)頁(yè)被惡意刷新,致使同一條記錄重復(fù)插入到數(shù)據(jù)庫(kù)中,這是一個(gè)比較棘手的問(wèn)題。我們可以從客戶端和服務(wù)器端一起著手,設(shè)法避免同一表單的重復(fù)提交。
    解決方案:

    1.使用客戶端腳本
    提到客戶端腳本,經(jīng)常使用的是JavaScript進(jìn)行常規(guī)輸入驗(yàn)證。在下面的例子中,我們使用它處理表單的重復(fù)提交問(wèn)題,請(qǐng)看下面的代碼:
       

     

    <form method="post" name="register" action="test.php" enctype=
    "multipart/form-data"
    > 
    <input name="text" type="text" id="text" />
    <input name="cont" value="提交" type="button" onClick="document.
    register.cont.value='正在提交,請(qǐng)等待';document.register.cont.
    disabled=true;document.the_form.submit();"
    > 
    </form>

     

    上述方法,主要是將按鈕的提交狀態(tài)改變?yōu)閐isabled。

     

    2.利用Struts2的令牌機(jī)制。
    防止表單重復(fù)提交主要用的到標(biāo)簽是<s: token />,攔截器 <interceptor-ref name="token" />,還有一個(gè)默認(rèn)的返回值<result name="invalid.token">/input.jsp</result>

    在頁(yè)面加載時(shí),<s: token />產(chǎn)生一個(gè)GUID(Globally Unique Identifier,全局唯一標(biāo)識(shí)符)值的隱藏輸入框如:
    <input type="hidden" name="struts.token.name" value="struts.token"/>
    <input type="hidden" name="struts.token" value="BXPNNDG6BB11ZXHPI4E106CZ5K7VNMHR"/>
    同時(shí),將GUID放到會(huì)話(session)中;在執(zhí)行action之前,“token”攔截器將會(huì)話token與請(qǐng)求token比較,如果兩者相同,則將會(huì)話中的token刪除并往下執(zhí)行,否則向actionErrors加入錯(cuò)誤信息。如此一來(lái),如果用戶通過(guò)某種手段提交了兩次相同的請(qǐng)求,兩個(gè)token就會(huì)不同。
    下面用零配置來(lái)演示 token的作用
    /WEB-INF/content/test-success.jsp

    <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
    <%@ taglib prefix="s" uri="/struts-tags" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <html>
    <head>
    </head>


        
    <body>
           
    <s:actionerror/>
           
    <s:form action="test!save.action" method="POST">
               
    <s:textfield name="message" label="請(qǐng)輸入您的信息"/>
               
    <s:token name="token"/>
               
    <s:submit value="確定" />
           
    </s:form>
        
    </body>
    </html>

    /WEB-INF/content/error.jsp

    <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
    <%@ taglib prefix="s" uri="/struts-tags" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <html>
    <body>
    <s:actionerror/>
        不能重復(fù)提交表單!
    </body>
    </html>

     

    /WEB-INF/content/test-ok.jsp

     

    <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
    <%@ taglib prefix="s" uri="/struts-tags" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <html>
        
    <body>
           SAVE OK!
        
    </body>
    </html>

    TestAction.java

    package com.fun.actions;


    import org.apache.struts2.convention.annotation.InterceptorRef;
    import org.apache.struts2.convention.annotation.Result;
    import org.apache.struts2.convention.annotation.Results;


    import com.opensymphony.xwork2.ActionSupport;
    @Results(
    {
    @Result(name
    ="invalid.token",location="/index.html",type="redirect")}
    )
    @InterceptorRefs(
    {@InterceptorRef(value="token",params={"includeMethods","save"}),@InterceptorRef("defaultStack") })
    public class TestAction extends ActionSupport {
        
    private String message;
        
    public String execute(){
        
    return SUCCESS;
        }

        



        
    public String save(){
        
    return "ok";
        }

        
    public String getMessage() {
           
    return message;
        }

        
    public void setMessage(String message) {
           
    this.message = message;
        }

        
    }


    其實(shí),最主要的就是 token攔截器中還有 includeMethods()這個(gè)方法,表示的是,Action中的哪個(gè)方法需要經(jīng)過(guò)攔截器。屬性excludeMethods()這個(gè)方法表示的是哪個(gè)方法不經(jīng)過(guò)攔截器。如果,沒(méi)有加上“defaultStack”這個(gè)攔截器的話,則ActionContext的值將為null。

    posted on 2010-12-24 16:09 々上善若水々 閱讀(3370) 評(píng)論(1)  編輯  收藏 所屬分類: Struts2

    評(píng)論

    # re: Struts2.1 annotation防止表單重復(fù)提交  回復(fù)  更多評(píng)論   

    謝謝
    2013-10-27 22:50 | 訂單
    主站蜘蛛池模板: 亚洲国产美女精品久久久| 亚洲黄色三级网站| 黄色三级三级三级免费看| 成人免费毛片观看| 国产亚洲国产bv网站在线| 手机看黄av免费网址| 亚洲kkk4444在线观看| 免费观看的a级毛片的网站| 亚洲熟妇AV日韩熟妇在线| 成年女人免费v片| 亚洲成a人片在线不卡一二三区| 免费黄网在线观看| 免费VA在线观看无码| 亚洲福利视频一区二区| 中文字幕无码免费久久9一区9| 国产亚洲美女精品久久久久狼 | 亚洲国产日韩在线| 日韩欧美一区二区三区免费观看| 亚洲中文字幕无码中文字| 四虎亚洲国产成人久久精品 | 欧美激情综合亚洲一二区| 亚洲国产成人精品女人久久久| ww在线观视频免费观看w| 亚洲国产高清视频| 成人在线视频免费| 中文在线观看永久免费 | 亚洲成aⅴ人片久青草影院按摩| 国产免费AV片无码永久免费| 久久www免费人成精品香蕉| 亚洲AV午夜成人影院老师机影院| 波多野结衣免费在线| 精品特级一级毛片免费观看| 久久亚洲AV午夜福利精品一区 | 成人免费网站视频www| 亚洲国产精品va在线播放| 国产又黄又爽又猛免费app| 免费一级毛suv好看的国产网站 | 亚洲精品无码久久久久秋霞| 区久久AAA片69亚洲| 一个人免费观看视频www| 一级一级毛片免费播放|