防表单重复提交

来源:互联网 发布:罗马城市 知乎 编辑:程序博客网 时间:2024/05/01 14:36

 

<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

0 0
原创粉丝点击