第一种方法:用javascript来防止重复提交
<script>
var committed=false;
function dosubmit()
{
if(committed)
return false;
committed=true;
return true;
}
</script>
<body>
<form action="..." method="post" onsubmit="return dosubmit()">
用户名:。。。。。。
<input type="submit" value="提交" id="submit">
</form>
</body>
onsubmit只有在返回true时,才会提交。
第二种方法:
一次提交后,设置按钮为不可点,阻止重复提交。
<head>
<script type="text/javascript">
function dosubmit()
{
var sub=document.getElementById("submit");
sub.disabled="disabled";
return true;
}
</script>
</head>
<body>
<form action="/SessionShop/servlet/Form" method="post" onsubmit="dosubmit()">
用户名:<input type="text" name="username">
<input type="submit" value="提交" id="submit" >
</form>
</body>
上述两种方法都是客户端防止提交,但考虑到有的用户关闭了javasript,所以必须采用服务器端防止提交。先给代码:
Form.java
package com.form;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Form extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getSession().setAttribute("token", System.currentTimeMillis()+"");
// response.sendRedirect("/SessionShop/servlet/Form");
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
index.jsp
<form action="/SessionShop/servlet/DoForm" method="post" >
<input type="hidden" value="${ token}" name="token"></hidden>
用户名:<input type="text" name="username">
<input type="submit" value="提交" id="submit" >
</form>
DoForm.java
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String token = (String) request.getSession().getAttribute("token");
String client_token=request.getParameter("token");
System.out.println(token+"----"+client_token);
if(token==null)
{
System.out.println("不要重复提交1");
return ;
}
if(client_token==null)
{
System.out.println("不要重复提交2");
return ;
}
if(!token.equals(client_token))
{
System.out.println("不要重复提交3");
return ;
}
request.getSession().removeAttribute("token");
System.out.println("用户已添加到数据库");
}
然后说说服务器端阻止恶意提交的坑点:
1.在index.jsp中获取¥(token)的值时,很容易给两端加上空格,然后一直显示不能重复提交。
2.记得在用户添加到数据库后,一定要把Session的token属性给移除了。
提示:之所以用Session来携带token信息,是因为这个还要在DoForm文件里用,故不可以用request携带。