日期:2014-05-17  浏览次数:20686 次

jsp form 重复提交问题
我在一个页面A.jsp上点击“新增”按钮,跳转到新增页面。完成操作后返回到A.jsp.再次点击提交(不是点击“新增”,提交到本页面A.jsp)发现又新增了一条一模一样的记录。如何提交后防止有新增一条记录??
拜托大牛帮忙,谢谢
jsp?form?重复提交问题

------解决方案--------------------
利用struts的同步令牌机制  

  利用同步令牌(Token)机制来解决Web应用中重复提交的问题,Struts也给出了一个参考实现。

  基本原理: 

  服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。 

  if (isTokenValid(request, true)) {

   // your code here

   return mapping.findForward("success");

  } else {

   saveToken(request);

   return mapping.findForward("submitagain");

  } 

  Struts根据用户会话ID和当前系统时间来生成一个唯一(对于每个会话)令牌的,具体实现可以参考TokenPRocessor类中的generateToken()方法。
------解决方案--------------------
代码太多,你百度一下StrutsTaken,这是一个仿struts2的防止重复提交的功能插件,就一个类,原理楼上已经说了,用法你自己去找下。简要说明:第一次访问这个表单的时候,用这个request创建一个令牌;提交成功之后令牌失效,再提交成功无效。
第一次访问:
// 生成令牌
taken.saveToken(request);
提交表单的时候:
//isTokenValid()方法包含令牌失效方法!
 if (taken.isTokenValid(request, true)) {

//         String contents = request.getParameter("contents");
//         infoService.save(info);

//       } else {
//         model.addAttribute("message", "已提交,不要重复操作");
//         taken.saveToken(request);//另外一个令牌
//       }

------解决方案--------------------
感觉这个像是需要代码做校验判断而不是重复提交问题
------解决方案--------------------
form表单本来就有这样的提交特性的,你可以在action中查询一下,进行判断,就可以了。