1. 程式人生 > >struts2 token 使用方法及問題解決

struts2 token 使用方法及問題解決

struts2 token 使用說明

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

使用token標籤的時候,Struts2會建立一個GUID(全域性唯一的字串)放在session中,並且會成為一個hidden放在form中。
token攔截器會判斷客戶端form提交的token和session中儲存的session是否equals。如果equals則執行Action。否則攔截器直接返回invaid.token結果,Action對應的方法也不會執行

struts.xml中配置  

<action name="userRegister" class="UserRegisterAction"> <interceptor-ref name="defaultStack" /> <interceptor-ref name="token" /> <result name="invalid.token"> /jsp/service/power/login.jsp </result> <result name="success"> /jsp/service/power/login.jsp </result> <result name="fail"> /jsp/service/user/userRegister.jsp </result> </action>

 使用<s:token>得到控制檯提示資訊:"Could not find token name in params“,後來發現原來是把<s:token>標籤放在了<form>標籤外面,導致出現以上問題。

<s:token>標籤使用很簡單,用以避免表單的重複提交,其原理是使用者訪問頁面時,伺服器產生一個令牌值一起傳送給客戶端。當這個頁面被提交時,比較客戶端和已經儲存先前的令牌值,如果相等則清除令牌值,不相等表明表單已被提交,同時產生一個新令牌值,儲存到session中。

step 1:在<form>標籤裡面定義標籤<s:token/>

step 2:在struts.xml檔案內配置token攔截器

            <interceptor-ref name="token">

              <param name="excludeMethods">....</param> //這裡可以配置token攔截器的排隊方法

</interceptor-ref>

<result name=“invaild.token">/***.jsp</result>

step 3:可在頁面中新增<s:actionerror>顯示重複提交資訊

step 4:測試。提交頁面後,單擊重新整理,就自動轉到***.jsp

token 是在上一個action的執行方法後 會產生一個新的token放在session中 key 為“struts.token”  <s:token></s:token> 現實再頁面的時候會生成倆個隱藏標籤 一個叫struts.token.name  一個叫做是你struts.token.name  值作為name的隱藏標籤,

提交到後臺進行token 比對 不一樣返回invaild.token

注:

1. 當使用token攔截器時,必須設定invalid.token的result,而使用tokenSession時,則不需要。

2. 使用token攔截器時,必須使用<s:token>標籤,而且該標籤必須包含在Form中。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

我在使用struts2 token的過程中,遇到了一個問題,用了很長時間才解決,特記錄一下。

使用struts2 的 token,我的form表單不能例項化,為null ,

有個論壇上說的是使用<s:form>表單,修改後沒有任何變化。

如何使用struts2攔截器,或者自定義攔截器。特別注意,在使用攔截器的時候,在Action裡面必須最後一定要引用struts2自帶的攔截器預設堆疊defaultStack,如下(這裡我是引用了struts2自帶的checkbox攔截器):

<interceptor-ref name="checkbox">
<param name="uncheckedValue">0</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"/>
(必須加,否則出錯)

我的Action配置如下,

<action name="lossRateAction!*"
   class="com.oarage.lossanalyse.exchange.action.LossRateAction"
   method="{1}">
   <interceptor-ref name="token">
    <param name="includeMethods">addLossRate</param>
   </interceptor-ref>
   <interceptor-ref name="defaultStack"/>
   <result name="list">
    /framepages/lossRate/LossRateList.jsp
   </result>
   <result name="initAddLossRate">
    /framepages/lossRate/LossRateAdd.jsp
   </result>
   <result name="initUpdateLossRate">
    /framepages/lossRate/LossRateUpdate.jsp
   </result>
  </action>

這樣就可以正常使用了。記住,一定要新增上預設的攔截器。