有没有简单的方法防止网页刷新等导致数据重复提交到数据库,求详细代码,谢谢!!!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有没有简单的方法防止网页刷新等导致数据重复提交到数据库,求详细代码,谢谢!!!相关的知识,希望对你有一定的参考价值。

新手编写,很多不懂,现在自己想到的一个方法就是自己表单传递的数据与数据库以插入的数据查询出来做对比,对比一样的就return掉页面,但是好像完全不行,运行的时候是 rs.getString(1)那里报错,但可能其他地方也有问题,求大佬帮助!!!下面是我写的代码
<%
request.setCharacterEncoding("UTF-8");
String shr = request.getParameter("shr");
String lxfs = request.getParameter("lxfs");
String szdq = request.getParameter("szdq");
String xxdz = request.getParameter("xxdz");
String gmsl = request.getParameter("amount");
String fkje = request.getParameter("fkje");
String mjly = request.getParameter("mjly");

Connection conn=null;
Statement stat=null;
//加载数据库驱动类
Class.forName("com.mysql.jdbc.Driver").newInstance();
//数据库连接URL,包含用户和密码
String url="jdbc:mysql://localhost:3306/userinfo?user=root&password=root";
//获得一个与数据库的连接对象
conn = DriverManager.getConnection(url);
//创建一个Statement对象,可以用来执行sql语句
stat=conn.createStatement();
//编写一条sql语句
String sql_s="SELECT liuyan FROM a_user WHERE liuyan='"+mjly+"'";
ResultSet rs = stat.executeQuery(sql_s);
String str2 = rs.getString(1);
if(mjly.equals(str2))
out.print("请勿重复提交,谢谢");
rs.close();
stat.close();
conn.close();
return;
else
String sql="insert into b_user(a_user,phone,shengfen,address,num,money,liuyan)values('"+shr+"','"+lxfs+"','"+szdq+"','"+xxdz+"','"+gmsl+"','"+fkje+"','"+mjly+"')";
if(stat.executeUpdate(sql)==1)
out.print("");
else
out.print("抱歉!发生错误,订单提交失败,请重新打开页面提交");
if(stat!=null)
stat.close();
if(conn!=null)
conn.close();

%>

防止网页刷新导致数据重复提交,可以在表单中添加Token令牌机制,这即保证了安全性(防CSRF攻击),又能够验证重复提交,每次生成表单页面时,会生成一个Token,在每次提交数据时,都要求检查Token,通过token检验合法的请求,可以多去看看实战教程。 参考技术A 使用ajax,而不是表单,就会解决这个问题.(刷新重复提交"等")

假设你用jq
$.post("test.php", name: "John", time: "2pm" , res=>console.log(res));
假设你用axios
axios.post('test.php', name: "John", time: "2pm" ).then(res=>console.log(response))
参考技术B 你在添加之前,先查询一下数据库,如果存在这条记录就不添加,就是执行SQL的count函数,判断返回值是否是1,如果是1你就不提交追问

那要该怎么写(详细代码)?

追答

你查询应该会写吧,就是将你网页上那几个文本框的值获取到传入到SQL语句里面,后台专门(Java类里面),我给你看一个后台的例子:
public EmployeeBean SearchUserByID(Integer id)
EmployeeBean ea = null;
ResultSet rs = null;
PreparedStatement ps = null;
Connection con = null;
sql = "select * from Employee where ID=?";
try
con = BaseDAO.GetConnection();
ps = con.prepareStatement(sql);
ps.setInt(1, id);
rs = ps.executeQuery();
if (rs.next())
ea = new EmployeeBean();
ea.setId(rs.getInt(1));
ea.setDerpartId(rs.getInt(2));
ea.setName(rs.getString(3));
ea.setPassword(rs.getString(4));

catch (Exception e)
// TODO: handle exception
e.printStackTrace();
finally
BaseDAO.close(rs, ps, con);

return ea;

本回答被提问者采纳

防止表单重复提交

表单重复提交是在多用户Web应用中最常见、带来很多麻烦的一个问题。有很多的应用场景都会遇到重复提交问题,比如:

  • 点击提交按钮两次。
  • 点击刷新按钮。
  • 使用浏览器后退按钮重复之前的操作,导致重复提交表单。
  • 使用浏览器历史记录重复提交表单。
  • 浏览器重复的HTTP请求。

几种防止表单重复提交的方法

禁掉提交按钮。表单提交后使用Javascript使提交按钮disable。这种方法防止心急的用户多次点击按钮。但有个问题,如果客户端把Javascript给禁止掉,这种方法就无效了。

我之前的文章曾说过用一些Jquery插件效果不错。

Post/Redirect/Get模式。在提交后执行页面重定向,这就是所谓的Post-Redirect-Get (PRG)模式。简言之,当用户提交了表单后,你去执行一个客户端的重定向,转到提交成功信息页面。

这能避免用户按F5导致的重复提交,而其也不会出现浏览器表单重复提交的警告,也能消除按浏览器前进和后退按导致的同样问题。

在session中存放一个特殊标志。当表单页面被请求时,生成一个特殊的字符标志串,存在session中,同时放在表单的隐藏域里。接受处理表单数据时,检查标识字串是否存在,并立即从session中删除它,然后正常处理数据。

如果发现表单提交里没有有效的标志串,这说明表单已经被提交过了,忽略这次提交。

这使你的web应用有了更高级的XSRF保护。

在数据库里添加约束。在数据库里添加唯一约束或创建唯一索引,防止出现重复数据。这是最有效的防止重复提交数据的方法。

以上是关于有没有简单的方法防止网页刷新等导致数据重复提交到数据库,求详细代码,谢谢!!!的主要内容,如果未能解决你的问题,请参考以下文章

如何防止表单的重复提交

php避免form表单重复提交

form提交后刷新又提交一次,怎么解决,重复提交,求高人解答

防止表单重复提交

如何防止表单重复提交

bootstrap中模态框提交表单成功后,如果不对网页进行刷新,当再次提交表单时会提交重复数据,求解决