一、簡介
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>
Action沒有什麼特殊的,為了讓其運行時間久點,方便重復提交,
public String execute() throws Exception {
Thread.sleep(2000); // to simulate processing time
return SUCCESS;
}
調試問題:token標簽好像沒起什麼作用。
這個應該是tomcat部署的時候不正常造成的,重新部署,確保其部署時候無錯誤。
三、tokenSession方式
<action name="transfer2" class="com.meetcomet.action.transferAction">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="tokenSession" />
<result name="success">/welcome.jsp</result>
</action>
struts2文件上傳(保存為BLOB格式) http://www.linuxidc.com/Linux/2014-06/102905.htm
Struts2的入門實例 http://www.linuxidc.com/Linux/2013-05/84618.htm
Struts2實現ModelDriven接口 http://www.linuxidc.com/Linux/2014-04/99466.htm
遇到的Struts2文件下載亂碼問題 http://www.linuxidc.com/Linux/2014-03/98990.htm
Struts2整合Spring方法及原理 http://www.linuxidc.com/Linux/2013-12/93692.htm
Struts2 注解模式的幾個知識點 http://www.linuxidc.com/Linux/2013-06/85830.htm
Struts 的詳細介紹:請點這裡
Struts 的下載地址:請點這裡