2010-05-22 77 views
1

當我點擊一個命令按鈕,然後點擊瀏覽器後退按鈕的形式,再次單擊它,它提交第二次沒有拋出適當的異常...縫:令牌標籤不被尊重

即使陌生人,當我回來時,表單ID本身是不同的,這意味着它在某個時刻已經重新生成了「有效」的表單ID。

下面是相關的代碼:任何想法?

<h:form id="accountActivationForm"> 
    <s:token/> 
    <a4j:commandButton id="cancelActivateAccountButton" 
     action="#{controller[cancelAction]}" 
    image="/images/button-Cancel-gray.gif" 
     reRender="#{reRenderList}" 
     oncomplete="#{onCancelComplete}" /> 
     &#160; 
    <a4j:commandButton id="activateAccountButton" 
     action="#{controller[agreeAction]}" 
     image="/images/button-i-agree-continue.gif" 
     styleClass="activate-account-button" 
     reRender="#{reRenderList}" 
     oncomplete="#{onActivationComplete}"/> 
</h:form> 

澄清:

  • 我繼承了這一點,所以我試圖去改變它儘可能少。 (它在幾個地方使用。)
  • 每個操作都會返回一個視圖,而不是null。我已經通過一行一行地確認了這一點。
  • reRenderList在我當前的測試用例中是空的。
  • onActivationComplete也是空的。

我要來要去,模板通過模板,看看是否有人與嵌套形式做出,因爲我的同事不得不歸因於不相關的問題,所以它不能傷害消除,作爲一個可能的問題。

回答

2

s:token應該通過多次不耐煩地點擊相同的請求提交按鈕或刷新非重定向結果在網頁瀏覽器或在瀏覽器歷史記錄重新提交緩存頁,以避免重複/多次提交。

它可在客戶端導航來回瀏覽器的歷史作品只是意味着與形式的網頁緩存在客戶端的瀏覽器歷史記錄,並再次要求作爲品牌從服務器端新。這確實會返回一個新的令牌。使用類似於Firebug中的HTTP跟蹤器自己檢查它。

+0

好的,爲什麼當我點擊後退按鈕時會重新加載?防止再次提交表單的最好方法是什麼(因爲它不是同一個表單)? – 2010-05-23 17:18:36

+1

如果請求沒有被瀏覽器緩存,後退按鈕將重新執行請求。即該請求在響應頭中至少包含'Cache-Control:no-cache','Pragma:no-cache'和'Expires:0'。 – BalusC 2010-05-23 17:37:03