方式一:通过javaScript(此方法不是太靠谱,可以解决重复点击按钮的提交,但是刷新页面还是会重复提交)
<script type="text/javascript">
window.onload=function(){
document.getElementById("btn1").onclick=function(){
document.forms[0].submit();
document.getElementById("btn1").disabled=true;
}
}
</script>这种方式就是在提交之后将按钮禁用
方式二:Redirect after post(提价之后,将页面重定向到其他页面,这样刷新的就是另外一个页面不会导致表单重复提交,就算再次点击按钮也不会引起表单重复提交,因为已经离开了表单页面)
这种方法可以避免表单的重复提交,但它重定向到了另外一个页面,如果有些方法不需要重定向可以不适用这种方法
方式三:利用HttpSession防止表单的重复提交(推荐)
这种方案的实现原理是在提交表单的时候生成一个token(秘钥),把这个token分别放在两个位置,一个是固定不变的表单里面的hidden里,一个是放在session中,在页面中分别取出进行比较,如果两个相同则说明是同一个表单(相同判断完要将这个token从session中删除掉),如果不相同则表明不是同一个表单,这样就可以避免表单的重复提交。下面是jsp和java代码。
jsp:
<%@ page import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>新用户注册</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<!--如果使用springmvc或其他框架,可以从后台传过来-->
<%
String token = UUID.randomUUID().toString();
pageContext.setAttribute("token", token);
session.setAttribute("token", token);
%>
<form action="${pageContext.request.contextPath}/servlet/RegistServlet" method="post">
<input type="hidden" name="token" value="${token}"/>
姓名:<input type="text" name="name"/><br/>
<input type="submit" value="注册"/>
</form>
</script>
</body>
</html>
java:这里使用的是servlet,如果使用springmvc或struts等框架,可以照样处理
public class RegistServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String iToken = request.getParameter("token");//从表单中取出的token,这个是不变的
HttpSession session = request.getSession();
String sToken = (String) session.getAttribute("token");//这个是从session中取出的,每次刷新页面都会变化的
if(iToken.equals(sToken)){//如果相等就不是重复提交
String name = request.getParameter("name");
System.out.println(name);
response.getWriter().write("sucess");
session.removeAttribute("token");
}else{
response.getWriter().write("resubmit occured");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
这里只是模拟,实际开发中使用框架可以通过类似思路去处理。