2017-09-12 342 views
4

我在这里处于一种微妙的情况。在我的组织中,我们设计了库存管理系统,它是一个基于JSP页面和处理它们的servlet的Web应用程序。按下按钮后防止表单重新提交

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

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

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

不幸的是,由于公司法规的限制,我无法分享代码。我需要的是帮助防止此行为或解决方法。

在此先感谢..

+1

我知道你不能共享确切的代码,但有你能概括你的代码,使其无法公司具体的方法吗? – Michael

+0

我很抱歉迈克尔,但它是一个复杂的代码,我不知道你想要什么相关的部分。谢谢回复。 –

回答

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> 

一个缺点是,如果你的客户的浏览器禁用了JS,这不会work.Otherwise它应该工作。

+0

感谢您的回答。将尝试并让你知道:) –

+0

试验你的建议,并使其工作。谢谢! –

2

必须使用邮政重定向的获取方式:https://en.m.wikipedia.org/wiki/Post/Redirect/Get

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

+0

感谢您的建议和资源。但恐怕我不会允许对现有的代码做出重大改变。无论如何,我会尽力向我的上司解释,如果没有其他的东西:) –

+0

其实,它应该是非常直截了当的。对于无效输入,您不会更改任何内容 - 用户将看到一个页面,显示错误消息,如果他重新提交表单 - 它只会显示相同的验证错误。不过,对于成功提交,您将执行重定向而不是呈现页面。重定向到确认页面是一种很好的做法,因此用户知道他的行为确实成功了(可能是您的案例中的一项额外工作),但您也可以简单地重定向到同一页面。 – szczepanpp

3

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

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

正如有人已经提到的,如果你形式切换到POST方法Servlet的切换到的doPost,你不会有这个问题了。

另外,你也可以用javascript解决方案规避这个问题。以下是一些选项:

  • 您可以检查用户clicked the back button,如果为true,则禁用表单。

  • 另一种方式是通过storing a cookie您检查页面加载,如果存在的话,你可以禁用的形式。

+0

同样的事情发生在Android 6上的Firefox的'POST'表单中。您可以使用表单回到页面,并且它已经填充,因此您可以再次提交它。 – szczepanpp

+1

谢谢乔纳森我会尝试你的建议,并让你知道结果。 –

1

您可以使用此代码也

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

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