<script type="text/javascript">
var isCommited = false;
function chechPost(){
if (!isCommited){
isCommited = true;
return true;
}else{
alert("You can not submit again");
return false;
}
}
 document.ondblclick = function docondblclick() { window.event.returnValue = false; } document.onclick = function doconclick() { if (isCommited) { window.event.returnValue = false; } }
</script>

不足:当用户单击”刷新”,或单击”后退”再次提交表单,将导致表单重复提交。故还需后台程

序防止表单重复提交

 

FormServlet
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");
request.setCharacterEncoding("utf-8");
PrintWriter writer = response.getWriter();
//防止表单重复提交
String token = request.getParameter("token");
HttpSession session = request.getSession();
String tokeninsession = (String) session.getAttribute("token");
if(token==null) { response.sendRedirect("/day07/servlet/FormServlet1"); return; }
if(tokeninsession==null) {response.sendRedirect("/day07/servlet/FormServlet1"); return;}
if(!token.equals(tokeninsession)) {
response.sendRedirect("/day07/servlet/FormServlet1");
return;
}
session.setAttribute("token", null);
}

 

FormServlet1

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");
request.setCharacterEncoding("utf-8");
PrintWriter writer = response.getWriter();
String token = TokenProcessor.getInstance().makeToken();
request.getSession().setAttribute("token", token);
writer.write("<form action='/day07/servlet/FormServlet' method='post'>");
writer.write(" 用户名: <input type='text' name='username'><br>");
writer.write(" 密码: <input type='password' name='password'><br>");
writer.write("<input type='hidden' name='token' value='"+token+"'><br>"); // 令牌
writer.write("<input type='submit' value=' 登陆'>");
writer.write("</form>");
}
 
public class TokenProcessor { //工具类,产生随机令牌
//单例模式,私有的构造方法、提供私有变量记住实例、提供方法返回实例
private TokenProcessor(){}
private static TokenProcessor instance = new TokenProcessor();
public static TokenProcessor getInstance() { return instance; }
public String makeToken() {//产生令牌
//产生一个随机数 222332343434324234 3333 1 343242423
String token = System.currentTimeMillis() + new Random().nextInt(1999999) + "";
try { //数据指纹 md5 算法
MessageDigest md = MessageDigest.getInstance("md5");
byte[] md5 = md.digest(token.getBytes());
//base64算法 将3个字节转成4个字节
BASE64Encoder encoder = new BASE64Encoder();
String data = encoder.encode(md5);
return data;
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
}

参考: http://mikzhang.iteye.com/blog/2043768