【问题标题】:Prevent form resubmit after pressing back button按下返回按钮后防止表单重新提交
【发布时间】:2018-02-21 07:49:25
【问题描述】:

我在这里有点微妙的情况。在我的组织中,我们设计库存管理系统,它是一个基于 JSP 页面和处理它们的 servlet 的 Web 应用程序。

我被要求解决一个特定问题。我们有一个带有 HTML 表单的 JSP 页面,其中有股票详细信息。当用户手动输入详细信息并提交表单时,数据库中的库存详细信息会更新并且工作正常。

问题是这样的:当用户按下浏览器的返回按钮时,用户可以回到他提交详细信息的上一个页面。当用户提交时,数据会再次保存到数据库中。我需要防止这种行为。(清除并重新加载页面之类的东西。)

到目前为止我所做的事情:清除浏览器缓存。代码工作正常,但不是预期的结果。

很遗憾,由于公司规定,我无法分享代码。我需要的是帮助防止这种行为或解决方法。

提前谢谢..

【问题讨论】:

  • 我知道您不能分享确切的代码,但有没有办法可以概括您的代码以使其不是公司特定的?
  • 对不起迈克尔,但它是一个复杂的代码,我不知道你想要什么相关的部分。感谢您的回复。

标签: java servlets browser form-submit back-button


【解决方案1】:

您可以在隐藏属性的帮助下使用 javascript 函数来重新加载网页。当用户按下后退按钮时,根据 hidden 属性的值,页面将被重新加载,而不加载缓存的页面。

您清除缓存的方法是正确的。再加上,您可以使用这种方法。

<input type="hidden" id="refreshed" value="no">
    <script type="text/javascript">

           onload=function(){
               var e=document.getElementById("refreshed");
               if(e.value=="no")e.value="yes";
               else{e.value="no";location.reload();}
           }

    </script>

这种方法的一个缺点是,如果您客户的浏览器禁用了 JS,这将不起作用。否则它应该可以工作。

【讨论】:

  • 感谢您的回答。将尝试并让您知道:)
【解决方案2】:

当用户按下浏览器的返回按钮时,用户可以来到 他提交详细信息的上一页。而当用户提交 这样,数据将再次保存到数据库中。

根据您的描述,这是基于 doGet 请求。这意味着每次您访问该 URL 时,它都会发送带有添加的任何参数的请求。

正如有人已经提到的,如果您将表单切换为 post 方法将 Servlet 切换为 doPost,您将不会再遇到此问题。 p>

或者,您可以使用 javascript 解决方案来规避此问题。以下是一些选项:

【讨论】:

  • 我在 Android 6 上的 Firefox 中的 POST 表单上发生了同样的事情。您返回到带有表单的页面,它已经被填充,因此您可以再次提交。
  • 谢谢乔纳森,我会尝试你的建议并告诉你结果。
【解决方案3】:

您也可以使用此代码

$(document).ready(function() {
    function disableBack() { window.history.forward() }

    window.onload = disableBack();
    window.onpageshow = function(evt) { if (evt.persisted) disableBack() }
});

【讨论】:

    【解决方案4】:

    您必须使用 Post-Redirect-Get 模式:https://en.m.wikipedia.org/wiki/Post/Redirect/Get

    实际上,每次使用带有method="post" 的标准HTML 表单都应该使用该模式来实现。它对 AJAX 发布的表单没有任何用处,这实际上可能是另一种解决方案,但需要更多的工作,并且可能需要进行一些架构更改。

    【讨论】:

    • 感谢您的建议和资源。但恐怕我不会被允许对已经存在的代码做剧烈的改变。无论如何,如果没有其他办法,我会尝试向我的上级解释:)
    • 其实应该很简单。对于无效输入,您不会更改任何内容 - 用户将看到一个带有呈现错误消息的页面,如果他重新提交表单 - 它只会显示相同的验证错误。但是,为了成功提交,您执行重定向而不是呈现页面。重定向到确认页面是一个很好的做法,因此用户知道他的操作确实成功(在您的情况下可能是额外的工作),但您也可以简单地重定向到同一页面。
    【解决方案5】:

    我在构建 django web 应用程序时遇到了同样的问题,我的解决方案是不允许缓存包含表单的 html。在您的请求处理程序中,不允许浏览器缓存页面。这将强制浏览器从文档中获取新页面。

    在这种情况下,您只需在请求处理程序中验证请求的表单是否已提交。

    我的代码供参考:

    from django.views.decorators.cache import never_cache
        @never_cache
          def GetForm(request, pk):
              # Logic #
              if (IsFormCompleted(pk)):
                 # Handle request #
    

    【讨论】:

      猜你喜欢
      • 2011-12-06
      • 2013-02-20
      • 2011-10-15
      • 1970-01-01
      • 2015-12-30
      • 2012-07-07
      • 2016-02-06
      • 1970-01-01
      • 2023-03-26
      相关资源
      最近更新 更多