2010-05-22 48 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