`

利用Session防止表单重复提交

 
阅读更多

1 由于服务器缓慢或者网络延迟的原因,重复点击提交按钮
 2 已经提交成功,但是还不停刷新成功页面
 3 已经提交成功,通过回退,再次点击提交按钮。
这些情况都可能使数据库中产生过多相同的冗余数据,浪费数据库资源。只有转发才会出现,重定向则不会。
 针对第一种情况的解决方案(使用JavaScript),对后面两种无效:
 首先在页面中添加如下格式的JavaScript代码
 <script type="text/javascript">
  var submitFlag=false;
  function checksubmit(){
  if(!submitFlag){
   submitFlag=true;
   document.forms[0].submit(); 
   }
  }
 </script>
(1)当提交按钮的type属性为button时:
设置按钮的onClick=”checksubmit();”即可。
(2)当提交按钮的type属性为submit时:
设 置按钮的onClick=”checksubmit();”,并在<form>标签中增加onsubmit=”return false”。因为submit按钮的自动提交时在点击事件提交之后,将onsubmit设置为”return false”,submit按钮的自动提交就会失效。
 对于后面两种情况,可以使用session解决,其原理是在运行添加信息页面时在 session中放置信息,然后页面提交信息给servlet处理,servlet获取session中的信息,如果session中有信息不为空则将信 息插入数据库,然后删除session中的信息,下次再提交表单时session中的信息为空,那么则不执行存储信息过程。
 但是单纯使用session有其局限性,所以在实际开发中,一般使用利用session结合UUID解决表单的重复提交,代码如下:
定义一个UuidToken类
public class UuidToken {
 private static UuidToken UuidToken=new UuidToken();
 private UuidToken(){ 
 }
 public static UuidToken getUuidToken() {
  return UuidToken;
 }
 public  synchronized String getUUIDAsStr(HttpServletRequest request){
  HttpSession session=request.getSession();
  String uuidStr=UUID.randomUUID().toString();
  if(uuidStr!=null){
   session.setAttribute("session.uuid", uuidStr);
  }
  return uuidStr;
 }
 /**
  * 判断session中保存的uuid和jsp页面上的uuid是否相等
  */
 public synchronized boolean isUUIDValidate(HttpServletRequest request) {
  //获取已存在的session
  HttpSession session=request.getSession(false);
  if(session==null){
   return false;
  }
  String sessionuuid = (String)session.getAttribute ("session.uuid");
  if(sessionuuid==null){
   return false;
  }
  String htmluuid=request.getParameter("html.uuid");
  if(htmluuid==null){
   return false;
  }
  return sessionuuid.equals(htmluuid);
 }
 /**
  * 删除uuid
  */
 public synchronized void resetUUID(HttpServletRequest request) {
  HttpSession session=request.getSession(false);
  if(session==null){
   return;  
  }  
  session.removeAttribute("session.uuid");
 }
}
 在jsp页面增加一个隐藏域,利用uuid生成一个唯一的标识号,赋给隐藏域,把唯一的标识号 放置到session中一份,代码如下:
<input type="hidden" name="html.uuid" value='<%=UuidToken.getUuidToken().getUUIDAsStr(request)%>'>      
       提交给servlet后,获取 jsp页隐藏域的值,用隐藏域的值和session中放置的值做比对,如果相同,保存数据并从session中删除UUID,不相同则说明是重复提交,不进行处理。
 boolean flag= UuidToken.getUuidToken().isUUIDValidate(request);
                  if(flag){
     // 保存信息到数据库
     //从session删除uuid的
     UuidToken.getUuidToken().resetUUID(request);
                  }else{
                  System.out.println("表单重复提交");
    }

 

http://blog.csdn.net/liuxiaolei7676/article/details/5646165

分享到:
评论

相关推荐

    浅谈利用Session防止表单重复提交

    主要介绍了浅谈利用Session防止表单重复提交,简单介绍表单重复提交的情况,分析,以及解决方法代码示例,具有一定借鉴价值,需要的朋友可以了解下。

    struts2利用token防止表单重复提交(源代码)

    struts2防止表单重复提交,利用struts的拦截器tokenSession,轻轻松松解决表单重复提交的问题。 附件为源代码,后台延迟了3秒,可直接在web服务器下部署运行,输入用户名和密码后,多点几次提交按钮,然后看控制台...

    java实现防止表单重复提交

    服务器端避免表单的重复提交,利用同步令牌来解决重复提交的基本原理如下:(1)用户访问提交数据的页面,服务器端在这次会话中,创建一个session对象,并产生一个令牌值,将这个令牌值作为隐藏输入域的值,随表单一起发送到...

    PHP防止刷新重复提交页面的示例代码

    PHP防止刷新重复提交,通过不断刷新(Refresh or Reload)表单提交页面,可以重复提交表单内容,可以利用 PHP 的 Session 来避免这一点,Session 保存在服务器端,在 PHP 过程中改变 Session 变量的值后,即保存在...

    ASP200问.EXE

    38.如何利用Session防止用户重复投票 40.如何在Session对象失效后重新设置Session对象 41.如何创建、读写和删除Cookie 43.如何遍历Cookies集合 44.如何判断客户端的Cookie是否处于开启状态 45.如何使用Cookie记录...

    PHP程序开发范例宝典III

    实例031 不提交表单获取单选按钮的值 43 实例032 选中单选按钮后显示其他表单元素 44 实例033 根据数据表结构自动生成数据录入页面 45 实例034 投票系统中单选按钮与复选框的应用 47 2.3 下拉列表的应用 ...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例172 不提交表单获取单选按钮的值 207 实例173 实现复选框中的全选、反选和不选 208 实例174 隐藏域提交用户的ID值 210 实例175 图像域替代提交按钮 211 实例176 跳转菜单实现页面跳转 213 实例177 上传图片预览 ...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例172 不提交表单获取单选按钮的值 207 实例173 实现复选框中的全选、反选和不选 208 实例174 隐藏域提交用户的ID值 210 实例175 图像域替代提交按钮 211 实例176 跳转菜单实现页面跳转 213 实例177 上传图片预览 ...

    深入浅出Struts2(附源码)

    第15章防止重复提交 252 15.1 标记管理 252 15.2 使用Token拦截器 253 15.3 使用Token Session拦截器 256 15.4 小结 257 第16章调试与性能分析 258 16.1 debug标签 258 16.2 Debugging拦截器 259 16.3 性能...

    深入浅出Struts 2 .pdf(原书扫描版) part 1

    第15章 防止重复提交 252 15.1 标记管理 252 15.2 使用Token拦截器 253 15.3 使用Token Session拦截器 256 15.4 小结 257 第16章 调试与性能分析 258 16.1 debug标签 258 16.2 Debugging拦截器 259 16.3 性能分析 ...

    asp.net知识库

    SubmitOncePage:解决刷新页面造成的数据重复提交问题 SharpRewriter:javascript + xml技术利用#实现url重定向 采用XHTML和CSS设计可重用可换肤的WEB站点 asp.net的网址重定向方法的比较:面向搜索引擎友好 也谈 ...

    C#编程经验技巧宝典

    8 &lt;br&gt;0018 有效利用Visual Studio 2005附带程序 8 &lt;br&gt;0019 有效使用MSDN帮助 9 &lt;br&gt;0020 如何设置MSDN帮助 9 &lt;br&gt;1.4 其他 10 &lt;br&gt;0021 如何添加项目引用 10 &lt;br&gt;0022 如何添加Web...

Global site tag (gtag.js) - Google Analytics