java 按“后退”按钮后禁止重新提交表单

6bc51xsx  于 2022-11-20  发布在  Java
关注(0)|答案(6)|浏览(167)

在我的组织中,我们设计股票管理系统,它是一个基于JSP页面和servlet的Web应用程序来处理它们。
我被要求修复一个特定的问题。我们有一个JSP页面,其中有一个HTML表单表,其中有股票详细信息。当用户手动输入详细信息并提交表单时,股票详细信息在数据库中更新,它工作正常。
问题在于:当用户按下浏览器的后退按钮时,用户可以返回到他提交详细信息的上一页。当用户提交此信息时,数据将再次保存到数据库中。我需要防止这种行为。(比如清除并重新加载页面。)
到目前为止我做的事情:清除浏览器缓存。代码运行正常,但结果不是预期的。
不幸的是,由于公司规定,我不能分享代码。我需要的是帮助来防止这种行为或变通办法。
提前感谢。

omtl5h9j

omtl5h9j1#

您可以使用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>

这种方法的一个缺点是,如果你的客户端浏览器禁用了JS,它就不能工作。否则它应该工作。

sg24os4d

sg24os4d2#

当用户按下浏览器的后退按钮时,用户可以返回到他提交详细信息的上一页。当用户提交该页时,数据将再次保存到数据库中。
根据你的描述,它是基于doGet请求的,这意味着每次你访问那个URL时,它都会发送一个带有任何参数的请求。
正如有人已经提到的,如果您将表单切换到post方法将Servlet切换到doPost,您将不再有这个问题。
或者你可以用javascript解决方案来解决这个问题。

piv4azn7

piv4azn73#

您还可以使用此代码

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

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

xt0899hw4#

您必须使用Post-Redirect-Get模式:https://en.m.wikipedia.org/wiki/Post/Redirect/Get
实际上,每次使用method="post"的标准HTML表单都应该使用该模式来实现。它对AJAX发布的表单没有任何用处,AJAX发布的表单实际上可以是另一种解决方案,但需要更多的工作,可能还需要一些架构上的更改。

kgsdhlau

kgsdhlau5#

我在构建django web app时也遇到了同样的问题,我的解决方案是不允许缓存包含表单的html。在请求处理程序中,不允许浏览器缓存页面。这将迫使浏览器从文档中获取新的页面。
在这种情况下,您可以在请求处理程序中验证请求的表单是否已经提交。
我的参考代码:

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

tcbh2hod6#

这里有一个解决方案。
在表单的隐藏字段中给予一个随机ID。2然后在服务器端,如果用户重新提交,检查随机ID是否已经在数据库中。3如果是,重定向用户。

相关问题