首页 > 代码库 > Servlet、SPringMVC、Struts等防止表单重复提交的多种处理方法
Servlet、SPringMVC、Struts等防止表单重复提交的多种处理方法
第一种处理方法(非拦截器):
目前这种方法不建议,因为JSP规范不建议写JAVA代码。这种可以方便第二种处理方法的理解,第二种方法引入拦截器的思想,原理基本一样,模仿Struts的Token机制。
1、在需要防止重复的jsp中加入下面的java代码,
<%@page import="java.util.Random"%> <%@page import="java.util.Set"%> <%@page import="java.util.HashSet"%> <% //生成一个Token,算法可以自己定,不随便重复就可以了 Random ran = new Random(); String formhash = String.valueOf(ran.nextInt()); //读取当前session里面的hashCode集合,此处使用了Set,方便判断。 Set<String> token= (Set<String>) session.getAttribute("token"); if (token== null) { token = new HashSet<String>(); } // 检测重复问题 while (token.contains(formhash)) { formhash = String.valueOf(ran.nextInt()); } // 保存到session里面 token.add(formhash); // 保存 session.setAttribute("token", token); %>2、 from表单中加入隐藏域
<input type="hidden" name="formhash" id="formhash" value=http://www.mamicode.com/"" />
3、后台代码 判断是否重复提交
Map<String,String> map = new HashMap<String,String>(); // 拿到表单的formhash String formhash = request.getParameter("formhash"); // 拿到session里面的集合 Set<String> token= (Set<String>) request.getSession().getAttribute("token"); // 如果没有,则是重复提交,或者非法提交 if (token== null || !token.contains(formhash)) { map.put("flag", "false"); map.put("message", "已经提交成功,请勿重复提交!"); return map; } // 最后,如果操作成功,从session里面把这个formhash 删掉! token.remove(formhash); request.getSession().setAttribute("token", token);如果重复提交了,直接return错误信息给页面即可。
第二种处理方法(拦截器):
如果用过Struts2的,可以参考Struts2的Token相关机制即可。下面的实现是SpringMVC/SPring/Mybatis项目中实现的方法。(代码稍后整理贴出)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。