<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);
}
}
}
相关推荐
javascript方式防止表单重复提交,
客户端防表单重复提交和服务器端session防表单重复提交.
springboot2.1+redis+拦截器 防止表单重复提交详细完整介绍,所用到的文件都上传了,下载即可使用。自己花了半天整理,并且测试通过,使用在实际项目中的,希望对每一个下载的朋友有帮助。
这是一个关于防止表单重复提交的练习,大神勿喷!
防止表单重复提交的方法(简单的token方式),内附实现代码及实现思路。
防止表单重复提交。判断是新打开的页面还是刷新的页面 判断是新打开的页面还是刷新的页面
提交表单后提交禁用提交按钮,防止重复提交.
自定义封装注解类,(生成token存放到redis中)通过注解的方式解决API接口幂等设计防止表单重复提交
几种防止表单重复提交的方法 禁掉提交按钮。表单提交后使用Javascript使提交按钮disable。这种方法防止心急的用户多次点击按钮。但有个问题,如果客户端把Javascript给禁止掉,这种方法就无效了。 我之前的文章曾说...
当用户将信息提交到服务器,服务器响应采用forward方式调转到下一个页面后,此时地址栏中显示的是上个页面的URL,若刷新当前页面,浏览器会将再次提交用户先前输入的数据,就会再次出现表单重复提交的问题。...
struts2防止表单重复提交,利用struts的拦截器tokenSession,轻轻松松解决表单重复提交的问题。 附件为源代码,后台延迟了3秒,可直接在web服务器下部署运行,输入用户名和密码后,多点几次提交按钮,然后看控制台...
服务器端避免表单的重复提交,利用同步令牌来解决重复提交的基本原理如下:(1)用户访问提交数据的页面,服务器端在这次会话中,创建一个session对象,并产生一个令牌值,将这个令牌值作为隐藏输入域的值,随表单一起发送到...
自定义标签防止表单重复提交 部署运行即可使用。
主要介绍了浅谈利用Session防止表单重复提交,简单介绍表单重复提交的情况,分析,以及解决方法代码示例,具有一定借鉴价值,需要的朋友可以了解下。
struts2防止表单重复提交--重定向
主要介绍了spring boot 防止重复提交实现方法,结合实例形式详细分析了spring boot 防止重复提交具体配置、实现方法及操作注意事项,需要的朋友可以参考下
redis专栏 002 springboot redis 防止表单重复提交
先说对话框(Dialog)里的表单提交 错误方案 说起错误方案,比如,点击提交按钮,本地验证,验证通过立即让按钮不可点,这些没问题,而我的错误点概括是:在某个最后执行的回调函数的最后一行,我做了2个操作:1,...