表單的重復(fù)提交將加重服務(wù)器的負(fù)擔(dān),且可能導(dǎo)致錯(cuò)誤操作,故需要進(jìn)行避免。
若刷新表單頁(yè)面后再提交則不是表單的重復(fù)提交;表單的重復(fù)提交是指,在不刷新表單頁(yè)面的前提下,如發(fā)生以下任意情況:
多次點(diǎn)擊提交按鈕;已經(jīng)提交成功,回退后再次點(diǎn)擊提交按鈕;在控制器響應(yīng)頁(yè)面的形式為轉(zhuǎn)發(fā)情況下,提交成功后點(diǎn)擊 “刷新(F5)”。 基本原理如下圖所示: 
第一步:在表單中添加s:token子標(biāo)簽;其作用是生成一個(gè)隱藏域,并在session中添加一個(gè)與隱藏域的值相同的屬性值。核心示例代碼如下所示:
<body> <s:form action="testToken"> <s:token></s:token> <s:textfield name="username" label="userName"></s:textfield> <s:submit></s:submit> </s:form></body>第二步:使用Token或TokenSession攔截器;
兩者均是解決表單重復(fù)提交問題的,但均不在默認(rèn)攔截器棧中,需要進(jìn)行手工配置;若使用Token攔截器,則需要配置name=invalid.token的result;若發(fā)生重復(fù)提交時(shí),該攔截器會(huì)轉(zhuǎn)到該配置頁(yè)面;若使用TokenSession攔截器,則不需要配置任何其他的result;若發(fā)生重復(fù)提交時(shí)則仍會(huì)響應(yīng)目標(biāo)頁(yè)面,但不會(huì)執(zhí)行后續(xù)攔截器,就想什么都沒有發(fā)生一樣。核心示例代碼如下所示:
<action name="testToken" class="com.qiaobc.struts.action.TestTokenAction" method="execute"> <!--在defaultStack攔截器棧執(zhí)行前,先使用token攔截器--> <interceptor-ref name="token"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> <result>/success.jsp</result> <!--token攔截器:當(dāng)發(fā)生表單的重復(fù)提交時(shí),轉(zhuǎn)向token-error.jsp頁(yè)面--> <result name="invalid.token">/token-error.jsp</result> </action>注意:可以使用s:actionerror標(biāo)簽來(lái)顯示重復(fù)提交的錯(cuò)誤消息,該消息同樣可以在國(guó)際化資源文件中覆蓋,具體可參看struts-messages.PRoperties文件。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注