原因
一、重復(fù)提交 劫哼,應(yīng)該想到兩種場景:
1. 在下單叮趴,或者支付 這種情況 那么不允許? 刷新,不允許后退再點擊提交(后退之后提交會失敗权烧,修改了也不行)疫向。
2. 在填寫表單之后,提交完成之后豪嚎,不允許 刷新搔驼,但是允許 返回之后 提交,給用戶修改表單的機(jī)會侈询。
二舌涨、工作原理
在服務(wù)器端生成一個唯一的隨機(jī)標(biāo)識號,專業(yè)術(shù)語稱為Token(令牌)扔字,同時在當(dāng)前用戶的Session域中保存這個Token囊嘉。
- 將Token發(fā)送到客戶端的Form表單中温技,在Form表單中使用隱藏域來存儲這個Token,表單提交的時候連同這個Token一起提交到服務(wù)器端扭粱。
- 在服務(wù)器端判斷客戶端提交上來的Token與服務(wù)器端生成的Token是否一致舵鳞,如果不一致,那就是重復(fù)提交了琢蛤,此時服務(wù)器端就可以不處理重復(fù)提交的表單蜓堕。如果相同則處理表單提交,處理完后清除當(dāng)前用戶的Session域中存儲的標(biāo)識號博其。
(空了就不匹配了)
1套才、開發(fā)步驟
(1)jsp頁面寫上<%@ taglib uri="/struts-tags" prefix="s" %><s:token />//要在form范圍中
(2)struts.xml配置
<action name="user" class="com.struts2.action.UserAction">
<!-- 令牌攔截器1 -->
<!--啟用默認(rèn)攔截器 ,開發(fā)令牌的第2步 -->
<interceptor-ref name="defaultStack" />
<!--啟用自定義攔截器 ,開發(fā)令牌的第3步 -->
<interceptor-ref name="token">
<!-- 只攔截add方法 -->
<param name="includeMethods">add</param>
<!--只對add方法攔截
excludeMethods表示排除指定的方法,即不對標(biāo)記為excludeMethods的方法進(jìn)行攔截慕淡,
includeMethods表示包含指定的方法背伴,即對標(biāo)記為includeMethods的方法進(jìn)行攔截,
-->
</interceptor-ref>
<!-- 攔截后顯示的頁面不能在web-info下峰髓,不需要則不設(shè)置(token.jsp或) -->
<result name="invalid.token" type="redirect">/user/user!list.action<result>
<!--避免重復(fù)-->
.....result....</action>