代码改变世界

防止JSP表单数据重复提交

2015-02-04 11:43  夜半花开  阅读(1462)  评论(0编辑  收藏  举报

结合各种搜索资料,采用了两个方法
一、前台验证
1.首先在from表单加一个隐藏域字段,设值为true。例如:
<input type="hideen" name="tokenFlag" id="tokenFlag" value="true"/>
2.在js中表单提交的验证方法中加判断,如下:
var flag=$("#tokenFlag").val();
if(flag=="true"){
$("#tokenFlag").val('false');
//业务代码(验证、跳转)

}
二、后台验证
1.首先写一个token随机数的工具类,如下:

public class TokenUtils { 

private static String cons = "@_____@token@________@";    

public static String setToken(javax.servlet.http.HttpServletRequest request) { javax.servlet.http.HttpSession session = request.getSession(); String token = String.valueOf(java.util.UUID.randomUUID()) + String.valueOf(System.currentTimeMillis()); session.setAttribute("@_____@token@________@", token); String html="<input type=\"hidden\" name=\"@_____@token@________@\" value='"+token+"'/>"; return html; } public static boolean isToken(javax.servlet.http.HttpServletRequest request) { javax.servlet.http.HttpSession session = request.getSession(); String token = (String)session.getAttribute(cons); if (token == null) token = ""; String tv = request.getParameter(cons); session.removeAttribute(cons); return token.equals(tv); } }

2.jsp页面

导入tokenUtils类

<%@page language="java" import="com.wfms.crm.utils.tokenUtils"%>

在form表单中加入:

<%=TokenUtils.setToken(request) %> 

3.在提交的处理action中加入每次提交时判断:

if (TokenUtils.isToken(request)){
//业务逻辑处理
}

 

备注:第二种方法在chrome中适用,但是在ie中会产生一个bug:每次只能新增一条记录,新增多条时不走新增代码;

原因:chrome和IE的底层机制不同 ,ie如果请求相同的话会从缓存中读取,不再次访问链接

解决方案:在打开新增页面和提交表单数据的请求后面加一个为唯一值的随机参数;

 

心得:所有的请求后面最好都加一个唯一值的随机参数