【发布时间】:2025-12-09 18:20:03
【问题描述】:
我的简单网络应用程序如下:我有一个 JSP 表单 (MyForm.JSP),它接受用户输入并将其传递给我的第一个 servlet ("/myfirstservlet")。
这个 servlet 处理用户输入值到我的Fruits 表的 SQL 插入,然后将用户重定向到我的结果 servlet ("/results")。
我的结果 servlet 然后检查 "ADD" 参数,如果“真”(即它等于 "success")它最终将用户重定向到我的结果 JSP(Results.JSP),它存储在路径中:@ 987654328@.
我的 JSP 表单 (MyForm.JSP) 也存储在路径内:WEB-INF/MyFolder/MyForm.jsp
我这样做是为了防止用户通过单击结果 JSP 页面上的刷新按钮重新提交表单,以避免之前刚刚输入数据库的相同数据的多个条目。
我现在的问题是:如何防止用户在我的表单 (MyForm.JSP) 上单击提交按钮 多次 次,从而防止多行相同的数据进入我的数据库 不使用 使用 JavaScript 或 JQuery?
基本上,我想在我的服务器而不是客户端验证表单仅提交一次。
我的 JSP 表单 (MyForm.JSP):
<form action="myfirstservlet" do="POST">
<input type="text" name="fruit"><br>
<input type="text" name="color"><br>
<input type="submit" value="Submit">
</form>
我的第一个 servlet ("/myfirstservlet"):
protected void doPost(...){
String fruit = request.getParameter("fruit");
String color = request.getParameter("color");
String sql = "INSERT INTO fruits (fruit, color) VALUES" + "(\"" + fruit + "\", \"" + color + "\");";
utilitySQL.sqlInsert(sql); // My utility class that handles sql inserts
response.sendRedirect("results?ADD=SUCCESS");
}
我的结果 servlet ("/results"):
protected void doPost(...){
response.setContentType("text/html");
if (request.getParameter("ADD").equals("SUCCESS"))
request.getRequestDispatcher("WEB-INF/MyFolder/Results.jsp").forward(request, response);
}
我的结果 JSP (Results.JSP):
<body>
<h1>Results JSP</h1>
//Reads data from MySQL database and prints it as an Array List.
</body>
编辑:在我的第一个 servlet 中修复了我准备好的语句:
protected void doPost(...){
String fruit = request.getParameter("fruit");
String color = request.getParameter("color");
try
{
String sql2 = "INSERT INTO practice (fruit, color) VALUES (?, ?);";
Connection connect = SQLHelperClass.connectOnly();
PreparedStatement pstmt;
pstmt = connect.prepareStatement(sql2);
pstmt.setString(1, fruit);
pstmt.setString(2, color);
pstmt.execute();
response.sendRedirect("results?ADD=success");
}
catch (SQLException e)
{
e.printStackTrace();
}
}
【问题讨论】:
-
你考虑
<input type="submit" onclick="this.disabled=true" value="Submit">javascript吗? -
我读到最好在服务器中验证
-
好的,但你能告诉我你在验证什么吗?
-
服务器是否已接收到带有用户输入数据的表单,如果为true,则阻止来自具有相同数据的表单的其他多次提交点击。基本上,这是为了确保每次填写和提交的每个表单一次只插入一行。
-
通常在创建 Web 表单时,通过引导用户获得所需的用户体验来引导用户行为是一种很好的做法。禁用按钮或显示流程覆盖是避免多次提交的常用方法。如果你想做这个服务器端,想想你是否希望后端 api 限制多个
POST请求?如果是这样,数据库完整性或速率限制可能是不错的选择。
标签: java mysql jsp web-applications data-entry