方式一:通过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);

}


}

这里只是模拟,实际开发中使用框架可以通过类似思路去处理。