【问题标题】:Prevent form resubmission and insert into database on page refresh防止表单重新提交并在页面刷新时插入数据库
【发布时间】:2012-12-20 19:18:07
【问题描述】:

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

当页面刷新完成时,他们有什么其他方法可以防止插入数据库吗?

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

如果有解决办法,有人可以建议我吗?

更新:添加插入的代码,我正在手动刷新页面。似乎这是我之前错过考虑的错误。它在数据库中正确插入并在视图 jsp 中正确显示所有数据。当视图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中,我删除了属性集,然后在该页面中提供链接以再次返回主页。

【问题讨论】:

  • 你的页面刷新怎么样?
  • 你是如何使用 GET 或 POST 发帖的?
  • Ramesh 发布请求。使用多部分请求,我认为只有发布有效。

标签: java jsp servlets jstl


【解决方案1】:

一个简单的解决方法是在 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");

【讨论】:

  • 你能详细说明一下这个 Deepak 吗?
  • 添加了详细信息。希望对您有所帮助。
  • 是的,它是一个很好的解决方案,但 Deepak 还有其他更稳定的解决方案吗?
  • Deepak,什么时候应该移除标志?
【解决方案2】:

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

不要使用<input type=submit>提交表单,而是使用<input type=button>

【讨论】:

  • 我认为将输入类型从提交更改为按钮会破坏我的客户端验证逻辑。我不认为问题出在按钮上。这是用户添加数据的表单,此数据由servlet 并在处理它转发后通过调度程序向 JSP 请求以将其显示给用户。它的这个 jsp 在刷新时会执行双重插入。我只需要防止这种情况发生。但是我会尝试这种方法来实现我的其他一些功能这样做是因为这种方法也很好。谢谢 Manish。我不知道这是否是浏览器特定的问题。我在 IE 中得到了这个。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2016-01-18
    • 2017-01-15
    • 1970-01-01
    • 2016-01-15
    • 2021-07-02
    • 2017-05-15
    • 2012-09-14
    • 1970-01-01
    相关资源
    最近更新 更多