您的位置:首页 > 编程语言 > Java开发

Servlet、SPringMVC、Struts等防止表单反复提交的多种处理方法

2014-08-11 15:18 435 查看
第一种处理方法(非拦截器):

眼下这样的方法不建议,由于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="<%=formhash%>" />

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项目中实现的方法。(代码稍后整理贴出)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: