【问题标题】:Struts action called twice -Struts 动作调用了两次——
【发布时间】:2012-06-18 10:49:20
【问题描述】:

当我向浏览器提交表单时,表单被提交了两次。访问日志显示同时出现两个请求。两个不同的线程执行它。

问题是,第一个请求包含用户输入的属性值,而第二个请求调用仅包含请求对象中的空值。

这个问题并非总是发生。它只是偶尔发生,而且根本无法重现。在 IE8 和 IE9 中,我都遇到了这些问题。

有人知道为什么会这样吗?

【问题讨论】:

  • 你是使用ajax还是通过javascript提交表单?
  • 你能发布你的html
  • 如果其用户导致双重请求发生,请检查他们是否不双击。有些用户总是双击
  • 我最近遇到了这个问题,我认为@Umesh 暗示了答案。如果您在由提交按钮调用的脚本中使用 document.myform.submit(); 之类的东西,那么您有时会被两次提交击中。我似乎记得它只发生在 IE 而不是 Firefox 中,而且它只是偶尔发生。为了避免,我想我使用了document.myform.submit();return false; 或类似的东西。
  • @Peter 我尝试双击。但问题从未重现。

标签: java jsp struts request


【解决方案1】:

也许问题在于您在 javascript onclick 事件处理程序中使用了提交按钮和 document.forms[0].submit

因此动作被调用了两次:

第一次

document.forms[0].submit

第二次来

submit button action

【讨论】:

    【解决方案2】:

    你使用struts1 还是struts2?无论如何,它们都有避免重复提交的机制:token。 对于struts1,你需要在第一个action(表单页面的action)中调用saveToken(),struts的'html:form'标签会自动添加这个token到你的页面;在您的提交操作(处理表单的操作)中,调用 isTokenValid(request, true),这将验证来自您的页面和会话的令牌。

    对于 struts2,为您的提交操作添加拦截器 ref 令牌,并在您的表单页面中添加 's:token' 标记。

    上述解决方案限制了服务器端的重复提交,第二次请求将导致异常并作为无效请求处理。但是如果你想在 UI 端限制这个,你需要一些 javascript,比如:当你点击提交按钮时,禁用它以避免重复提交。

    【讨论】:

    • 谢谢沉!但我想在 UI 端限制它。
    • 是的,isTokenValid(request, true) 是关键。而不是 isTokenValid(request)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 2023-04-04
    • 2017-06-25
    • 2013-01-21
    • 2012-09-08
    • 2016-04-27
    相关资源
    最近更新 更多