1.客户端防表单重复提交
<form action="" method="post" οnsubmit="return dosubmit()" >
<script type="text/javascript">
//定义一个全局变量
var iscommitted = false;
function dosubmit() {
if(!iscommitted) {
//第一次提交,变为true
iscommitted = true;
return true;
} else {
return false;
}
}
</script>
另一种:让按钮变成灰色
<script type="text/javascript">
function dosubmit() {
//根据id查询 提交按钮
var input = document.getElementById("submit");
input.disabled='disabled';
return true;
}
</script>
<form action="" method="post" οnsubmit="return dosumit()" >
用户名:<input type="text" name="username" />
<input id="submit" type="submit" value="提交" />
</form>
这样防止不了恶意用户进行重复提交的;
客户端防止重复提交存在问题:
把页面另存为一个html,自己构建一个表单,把js代码去掉,然后提交。
如果把按钮变成diabled,不可以点击按钮,但是可以刷新啊,刷新就是把上次干的事情,在做一次。
还可以点击后退,在点击提交。
不过实际开发也要用,防君子。
2.服务器端防止表单重复提交
思路:1.生成表单的servlet,生成一个随机数,把这个随机数保存到session中
2.表单提交会带上这个随机数
3.把表单带过来的随机数与服务器中session里面比较
4.如果一致,提交表单,删除session中的这个随机数
生成表单的servlet,主要是生成随机数,放到session中
request.getSession().setAttribute("token", token);
在提交表单时,使用一个隐藏域,<input type="hidden" name="token" value=''
${token}" >
处理表单的Servlet
1.首先确认表单是否有效
boolen b = isTokenValid(request);
2.返回true,有效,可以提交
返回false,不让提交
if(!b) {
System.out.println("请不要重复提交");
return ;
}
表单处理完毕后,删除随机数
request.getSession().removeAttribute("token");
判断表单号是否有效的方法思路
private boolean isTokenValid(HttpSerfvletRequest request) {}
1.获取客户端带过来的随机数
String clientToken = request.getParameter("token");
没有带表单号,也认为是重复提交
if(clientToken == null) {
return false;
}
2.获得服务器存在session里面的token
String serverToken =(String) request.getSession.getAttribute("token");
如果服务端没有,也认为是重复提交
if(serverToken == null) {
return false;
}
3.判断是否一致
if(!clientToken .equals(serverToken)) {
return false;
}
return true;
第一次提交以后,刷新也不让提交,后退在提交也不让。