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

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

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

    athrunwang

    紀(jì)元
    數(shù)據(jù)加載中……
    使用Struts 2防止表單重復(fù)提交

      用戶重復(fù)提交表單在某些場合將會造成非常嚴(yán)重的后果。例如,在使用信用卡進(jìn)行在線支付的時候,如果服務(wù)器的響應(yīng)速度太慢,用戶有可能會多次點(diǎn)擊提交按鈕,而這可能導(dǎo)致那張信用卡上的金額被消費(fèi)了多次。因此,重復(fù)提交表單會對你的系統(tǒng)帶來邏輯影響,必須采取一些措施防止這類情況的發(fā)生。

      用戶重復(fù)提交同一個HTML表單的原因有: 一、快速多次點(diǎn)擊了提交按鈕;二、提交表單后按下瀏覽器的刷新按鈕。


    設(shè)置Struts 2的預(yù)防表單重復(fù)提交的功能 

          Struts 2已經(jīng)內(nèi)置了能夠防止用戶重復(fù)提交同一個HTML表單的功能。它的工作原理:讓服務(wù)器生成一個唯一標(biāo)記,并在服務(wù)器和表單里各保存一份這個標(biāo)記的副本。此后,在用戶提交表單的時候,表單里的標(biāo)記將隨著其他請求參數(shù)一起發(fā)送到服務(wù)器,服務(wù)器將對他收到的標(biāo)記和它留存的標(biāo)記進(jìn)行比較。如果兩者匹配,這次提交的表單被認(rèn)為是有效的,服務(wù)器將對之做出必要的處理并重新設(shè)置一個新標(biāo)記。隨后,提交相同的表單就會失敗,因?yàn)榉?wù)器上的標(biāo)記已經(jīng)重置。 

      Struts 2標(biāo)簽中的token標(biāo)簽,可以用來生成一個獨(dú)一無二的標(biāo)記。這個標(biāo)記必須嵌套在form標(biāo)簽中使用,它會在表單里插入一個隱藏字段并把標(biāo)記保存到HttpSession對象里。toke標(biāo)簽必須與Token或Token Session攔截器配合使用,兩個攔截器都能對token標(biāo)簽進(jìn)行處理。Token攔截器遇到重復(fù)提交表單的情況,會返回一個"invalid.token"結(jié)果并加上一個動作級別的錯誤。Token Session攔截器擴(kuò)展了Token攔截器并提供了一種更復(fù)雜的服務(wù),它采取的做法與Token攔截器不同,它只是阻斷了后續(xù)的提交,這樣用戶不提交多少次,就好像只是提交了一次。 


    示例:使用Token攔截器預(yù)防表單重復(fù)提交

    1.  配置struts.xml文件,聲明動作

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd"
    >
    <struts>
    <package name="avoidPackage" extends="struts-default">
    <action name="avoid" class="struts2.action.AvoidAction">
    <interceptor-ref name="token"></interceptor-ref>
    <interceptor-ref name="defaultStack"></interceptor-ref>

    <result name="invalid.token">/error.jsp</result>
    <result name="input">/input.jsp</result>
    <result name="success">/output.jsp</result>
    </action>
    </package>
    </struts>

    此時,需要在動作的聲明中,為動作添加token攔截器,因?yàn)閠oken攔截器不在defaultStack攔截器棧中,注意,需要將攔截器放在攔截器棧的第一位,這是因?yàn)榕袛啾韱问欠癖恢貜?fù)提交的邏輯應(yīng)該在表單處理前。

    2. 創(chuàng)建動作類

    public class AvoidAction extends ActionSupport {
    private static final long serialVersionUID = 2676453800249807631L;

    private String username;
    private Date birthday;

    public String getUsername() {
    return username;
    }
    public void setUsername(String username) {
    this.username = username;
    }
    public Date getBirthday() {
    return birthday;
    }
    public void setBirthday(Date birthday) {
    this.birthday = birthday;
    }

    @Override
    public String execute()
    {
    try {
    Thread.sleep(4000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }

    return SUCCESS;
    }

    }

    這個動作邏輯處理為掛起4秒鐘,讓我們有機(jī)會多次點(diǎn)擊提交按鈕,測試效果。

    3. 創(chuàng)建頁面:

    input.jsp

    <s:form action="avoid">
    <s:token></s:token>
    <s:textfield name="username" label="Enter your name"></s:textfield>
    <s:textfield name="birthday" label="Enter your birthday"></s:textfield>
    <s:submit value="submit"></s:submit>
    </s:form>

    要使用Struts 2的防止表單重復(fù)提交功能,需要在form標(biāo)簽中使用token標(biāo)簽,他會產(chǎn)生一個唯一的標(biāo)識符,與其他參數(shù)一起提交到服務(wù)器,服務(wù)器會根據(jù)token標(biāo)簽所產(chǎn)生的標(biāo)識符判斷表單是否為重復(fù)提交的表單,這個功能是由Token攔截器完成的。

    error.jsp

    <body>
    do not duplicate submissions form!
    </body>

    當(dāng)表單重復(fù)提交,Token攔截器會返回一個"invalid.token"結(jié)果,結(jié)果將頁面轉(zhuǎn)到這個頁面,提示用戶錯誤信息。

    output.jsp

    <body>
    Your Name : <s:property value="username"/>
    <br />
    Your Birthday : <s:property value="birthday"/>
    </body>

    若沒有重復(fù)提交表單,那么就顯示正確的頁面。

    4. 測試

    在瀏覽器中輸入:http://localhost:8081/AvoidDuplicateSubmissions/input.jsp,得到如下界面

    連續(xù)多次點(diǎn)擊"submit"按鈕,查看效果

    可以看到,token攔截器的設(shè)置生效了,他阻止了表單的重復(fù)提交,并給出了錯誤提示

    這次我們只點(diǎn)擊一次提交(請重新輸入URL,或后退到輸入頁面后刷新一下,這是因?yàn)閠oken的標(biāo)示在提交一次后已被修改,不刷新標(biāo)示符是不可能與服務(wù)器存留的標(biāo)示符一致的)

    可以看到,表單被正確的處理了。

    處理表單重復(fù)提交的另一個攔截器是 tokenSession,使用該攔截器與使用token攔截器并沒有什么差異只需要,引用該攔截器,其他與token攔截器完全一致

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd"
    >
    <struts>
    <package name="avoidPackage" extends="struts-default">
    <action name="avoid" class="struts2.action.AvoidAction">
    <interceptor-ref name="tokenSession"></interceptor-ref>
    <interceptor-ref name="defaultStack"></interceptor-ref>

    <result name="invalid.token">/error.jsp</result>
    <result name="input">/input.jsp</result>
    <result name="success">/output.jsp</result>
    </action>
    </package>
    </struts>

    posted on 2011-11-18 10:43 AthrunWang 閱讀(159) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 免费A级毛片无码A| 无码少妇一区二区浪潮免费 | 国产成人免费a在线视频app| 亚洲国产人成在线观看| 精品无码国产污污污免费网站 | 国产午夜精品久久久久免费视| 亚洲AV无码专区日韩| 视频一区二区三区免费观看| 日韩免费在线观看视频| 亚洲午夜福利717| 精品国产成人亚洲午夜福利| 噼里啪啦免费观看高清动漫4| 亚洲精品亚洲人成在线麻豆| 在免费jizzjizz在线播| 亚洲乱码日产精品BD在线观看| 国产又黄又爽又猛免费app| 色偷偷女男人的天堂亚洲网| 欧洲美熟女乱又伦免费视频| 久久亚洲AV成人无码国产电影 | 久久精品a亚洲国产v高清不卡| 99re在线视频免费观看| 亚洲国产精品张柏芝在线观看 | 中文字幕无码播放免费| 亚洲综合无码无在线观看| 免费大学生国产在线观看p| www一区二区www免费| 91情国产l精品国产亚洲区| 成人无遮挡裸免费视频在线观看| 亚洲欧美国产欧美色欲| 亚洲精品无码专区久久同性男| 国产在线国偷精品免费看| 国产亚洲精品xxx| 无人影院手机版在线观看免费| 精品亚洲福利一区二区| 区久久AAA片69亚洲| 牛牛在线精品观看免费正 | 亚洲精品综合久久中文字幕| 一本无码人妻在中文字幕免费| 免费无毒a网站在线观看| 亚洲国产精品人久久| 日本特黄特色aa大片免费|