F5重新整理-引起表單重複提交解決-
阿新 • • 發佈:2019-02-16
一、簡介
Struts2使用token攔截器來檢查表單是否重複提交,採用的是同步令牌的方式。
同步令牌方式:伺服器端在處理到達的請求之前,會將請求中包含的令牌值與儲存在當前使用者會話中的令牌值進行比較,看是否匹配。在處理完該請求後,且在答覆傳送給客戶端之前,將會產生一個新的令牌,該令牌除傳給客戶端以外,也會將使用者會話中儲存的舊的令牌進行替換。這樣如果使用者回退到剛才的提交頁面並再次提交的話,客戶端傳過來的令牌就和伺服器端的令牌不一致,從而有效地防止了重複提交的發生。
實現方法:
1)token
token攔截器進行攔截,如果為重複請求,就衝定向到名為invalid.token的Result。
2)tokenSession
tokenSession攔截器與token攔截器唯一的不同是在判斷某個請求為重複請求之後,並不是立即重定向到名為invalid.token的Result,而是先阻塞這個重複請求,直到瀏覽器響應最初的正常請求,然後就可以跳轉到處理正常請求後的Result了
二、token標籤
<package name="money" namespace="/money" extends="struts-default"> <action name="transfer" class="com.meetcomet.action.transferAction"> <interceptor-ref name="defaultStack" /> <!--使用token攔截器--> <interceptor-ref name="token" /> <!--攔截到後的輸出介面--> <result name="invalid.token">/index.jsp</result> <result name="success">/welcome.jsp</result> </action> </package>
輸入index.jsp
<s:form action="transfer" namespace="/money"> <!---token標籤---> <s:token></s:token> <!---用於顯示action的錯誤,因為設定的是攔截到後再次返回此頁,所以設定了這個標籤--> <s:actionerror/> <s:textfield label="Amount" name="amount" value="100"/> <s:submit value="Transfer money" /> </s:form>