Kir*_*adi 5 java jsp servlets jstl
我有一个servlet从表单中获取数据并将其插入数据库.在servlet中我使用bean并通过beans获取/设置数据.一旦插入发生,用户被重定向到视图,显示页面的确切方式看起来.这个页面是JSP.现在,当我执行此页面刷新(jsp)时,它再次确实将数据插入到数据库中.现在我需要防止这种情况发生.我在想的不是将其重定向到jsp,而是让我重定向到另一个servlet并从那个servlet让我做了get请求并将它转发给jsp进行查看.通过这种方法,我重构了我的jsp,我有很多jsp会受到影响.
他们是否可以阻止在页面刷新完成后插入数据库?
我还检查了数据库端假设我可以添加唯一约束,我确实有一些通过初始servlet生成的唯一列,所以每个插入值都不同,所以我不能真正使用DB方面的解决方案.
有人可以建议我,如果有这方面的工作吗?
更新:添加插入的代码,我手动刷新页面.像这样的错误是我错过了之前考虑的错误.它在数据库中正确插入并正确显示视图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);
}
Run Code Online (Sandbox Code Playgroud)
在错误页面jsp中,我删除了属性集,然后在该页面中提供链接以再次返回主页.
一个简单的解决方法是在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
}
Run Code Online (Sandbox Code Playgroud)
如果有可能存在用户插入其中两个记录的有效方案(可能是用户浏览,然后再次在同一个表中插入记录;这是一个有效的方案); 然后我们还需要在向用户显示表单之前添加以下代码:
session.removeAttribute("recordInsertedSuccessfully");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9848 次 |
| 最近记录: |