阻止表单重新提交并在页面刷新时插入数据库

时间:2013-01-07 03:38:35

标签: java jsp servlets jstl

我有一个servlet,它从表单中获取数据并将其插入数据库。在servlet中,我使用bean并通过beans获取/设置数据。一旦插入发生,用户被重定向到视图,显示如何完全是页面看起来。这个页面是JSP。现在,当我执行此页面刷新(jsp)时,它再次确实将数据插入到数据库中。现在我需要防止这种情况发生。我在想的不是将其重定向到jsp,而是让我重定向到另一个servlet并从该servlet让我执行get请求并将其转发给jsp进行查看。通过这种方法,我重构了我的jsp,并且我有很多jsp会受到影响。

在页面刷新完成后,我是否可以阻止插入数据库?

我还检查了数据库端,假设我可以添加唯一约束,我确实有一些通过初始servlet生成的唯一列,所以每个插入值都不同,所以我不能真正使用DB方面的解决方案。 / p>

有人建议我是否存在解决方法?

更新:添加插入的代码,我手动刷新页面。像这样的错误是我之前错过的错误。它在数据库中正确插入并正确显示视图中的所有数据jsp.When视图jsp被刷新,我在数据库中得到双重插入。

更新。删除代码。将发布代码的相关部分而不是整个代码。

问题已解决。

 javax.servlet.http.HttpSession session = request.getSession();            
        if (session.getAttribute("insertflag") == null) {
            mybean sf = new mybean();
            sf.insert(form);
            session.setAttribute("insertflag", insertid);
            RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/test/showtestform.jsp");                
            rd.forward(request, response);
        } else {                
            RequestDispatcher rd = request.getRequestDispatcher("/errorpage.jsp");
            rd.forward(request, response);
        }

在错误页面jsp中我删除了属性集,然后在该页面中提供链接以再次返回主页。

3 个答案:

答案 0 :(得分:7)

一个简单的解决方法是在Session中放置一个标志;每当插入完成时..如果存在此标志,则在插入之前始终检查会话。

在servlet中; 在插入数据库之前;进行以下检查:

if (session.getAttribute("recordInsertedSuccessfully") == null )
{
   //proceed with insertion
   //after inserting into the database we should do :
   session.putAttribute("recordInsertedSuccessfully","true");
} else {
   //case of form re-submission
}

如果有可能存在用户插入其中两条记录的有效方案(可能是用户浏览,然后再次在同一表中插入记录;这是一个有效的方案);然后我们还需要在向用户显示表单之前添加以下代码:

session.removeAttribute("recordInsertedSuccessfully");

答案 1 :(得分:1)

使用带有onclick事件的javascript提交表单

不要使用<input type=submit>提交表单并使用<input type=button>

答案 2 :(得分:0)

您对会话属性的看法是什么? 在表单上提交创建新的会话属性,并在成功完成工作后使其无效。

在action servlet上,如果session属性可用则添加条件,如果没有,则继续表单提交,然后重定向到表单页面。