Jsf Seam:未遵守令牌标记

Jsf Seam:未遵守令牌标记,jsf,seam,ajax4jsf,Jsf,Seam,Ajax4jsf,当我单击一个命令按钮,然后点击浏览器返回按钮到表单并再次单击它时,它会再次提交,而不会抛出正确的异常 更奇怪的是,当我回来时,表单id本身是不同的,这意味着它在某个点上重新生成了一个“有效”的表单id 以下是相关代码:有什么想法吗 <h:form id="accountActivationForm"> <s:token/> <a4j:commandButton id="cancelActivateAccountButton" acti

当我单击一个命令按钮,然后点击浏览器返回按钮到表单并再次单击它时,它会再次提交,而不会抛出正确的异常

更奇怪的是,当我回来时,表单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也为空

我将逐个模板查看是否有人使用嵌套表单制作,因为我的同事因此遇到了不相关的问题,因此,将其作为一个可能的问题加以解决不会有什么坏处。

通过在同一请求中多次不耐烦地单击提交按钮,或者通过刷新webbrowser中的未重定向结果,或者通过在浏览器历史记录中重新提交缓存页面,
s:token
应该可以避免双重/多次提交


当客户端通过浏览器历史来回导航时,它工作,这仅仅意味着带有表单的页面不会缓存在客户端的浏览器历史中,而是作为全新的页面从服务器端再次请求。这确实会返回一个新的令牌。请自己使用类似中的HTTP跟踪器进行检查。

好的,那么为什么我单击“上一步”按钮时会重新加载它?防止表单再次提交的最佳方法是什么(因为它不是同一个表单)?如果浏览器未缓存该请求,则“后退”按钮将重新执行该请求。即,请求在响应头中至少有
缓存控制:无缓存
Pragma:no Cache
过期:0