按下后退按钮后防止表单重新提交

时间:2017-09-12 18:36:01

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

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

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

问题是:当用户按下浏览器的后退按钮时,用户可以转到他提交详细信息的上一页。当用户提交此数据时,数据会再次保存到数据库中。我需要阻止此行为。(清楚并重新加载页面的内容。)

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

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

提前致谢..

5 个答案:

答案 0 :(得分:4)

  

当用户按下浏览器的后退按钮时,用户可以进入   上一页他提交了详细信息。并在用户提交时   这样,数据再次保存到数据库中。

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

如前所述,如果您将表单切换为post方法将Servlet切换为doPost ,则您不会再遇到此问题。

或者你可以通过javascript解决方案来规避这个问题。以下是一些选项:

答案 1 :(得分:4)

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

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

<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>

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

答案 2 :(得分:3)

您也可以使用此代码

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

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:0)

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

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

我的代码供参考:

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