答案就在问题 - “重复表单提交”,你有请求被发送到服务器,所以你必须处理他们两个。
因此,两个相同的请求从浏览器发送到服务器,因此该操作将被调用两次。
第一个请求会成功,并使用'withForm'块中的代码,令牌将递增。
第二个请求仍包含与第一个请求相同的令牌,但服务器已将该令牌抛出,所以第二个请求使用'invalidToken'块中的代码,或者如果您省略了默认块'invalidToken'块。
很重要的一点就是 - 它是第二个(坏的)请求将决定什么是在浏览器中显示,因为它第一后到达,所以我已经决定了,在处理错误的请求,将用户重定向回到索引,他们应该能够看到第一个请求创建和保存的记录。 即
}.invalidToken
{
println "myController: swallowing request with invalidToken (probably a double-click or due to using back button in browser.)"
flash.invalidToken = " " // just enough to trigger the g:if in the index.gsp
redirect action:"index", method:"GET"
}
然后在索引中。GSP,我显示一个消息:
<g:if test="${flash.invalidToken}">
<ul class="errors" role="alert">
<li>
<g:message code="error.doubleclick"
default="oops, the item you are creating exists already (maybe you double-clicked on the 'Save' button ?). Click on the item in the list below to continue working with that item."
/>
</li>
</ul>
此工程确定,并且是一般的好,你可以削减ñ粘贴到任何控制器,和index.gsp中,而无需进行自定义。
来源
2014-06-07 15:10:25
nby
谢谢! 我的操作是处理“POST”和“GET”方法。我从“withForm”范围中取出了“GET”部分,现在它工作正常。 –