我在这里有点微妙的情况。在我的组织中,我们设计库存管理系统,它是一个基于JSP页面和servlet的Web应用程序,用于处理它们。
我被要求修复一个特定的问题。我们有一个带有HTML表单的JSP页面,其中有库存详细信息。当用户手动输入详细信息并提交表单时,库存详细信息在数据库中更新,并且工作正常。
问题是:当用户按下浏览器的后退按钮时,用户可以转到他提交详细信息的上一页。当用户提交此数据时,数据会再次保存到数据库中。我需要阻止此行为。(清楚并重新加载页面的内容。)
我到目前为止所做的事情:清除浏览器缓存.Code工作正常但不是预期的结果。
遗憾的是,由于公司规定,我无法分享代码。我需要的是帮助防止这种行为或解决方法。
提前致谢..
答案 0 :(得分:4)
当用户按下浏览器的后退按钮时,用户可以进入 上一页他提交了详细信息。并在用户提交时 这样,数据再次保存到数据库中。
根据您的描述,这是基于doGet请求。这意味着每次访问该URL时,它都会发送带有添加的参数的请求。
如前所述,如果您将表单切换为post方法并将Servlet切换为doPost ,则您不会再遇到此问题。
或者你可以通过javascript解决方案来规避这个问题。以下是一些选项:
您可以检查用户是否clicked the back button,如果为真则禁用表单。
另一种方法是通过storing a cookie检查页面加载,如果存在则可以禁用表单。
答案 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 #