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

  

解决项目中表单重复提交的问题,在平常的项目中有以下几种可能出现表单重复提交的情况,比如说:

  

1。由于服务器缓慢或者网络延迟的原因,重复点击提交按钮

  

2。已经提交成功,但是还不停刷新成功页面

  

3。已经提交成功,通过回退,再次点击提交按钮。

  

这些情况都可能使数据库中产生过多相同的冗余数据,浪费数据库资源。只有转发才会出现,重定向则不会。

  

针对第一种情况的解决方案(使用JavaScript),对后面两种无效:

  

首先在页面中添加如下格式的JavaScript代码

        var submitFlag=false;   函数checksubmit () {   如果(! submitFlag) {   submitFlag=true;   document.forms [0]。submit ();   }   }   之前      

(1)当提交按钮的类型属性为按钮时:

  

设置按钮的onClick=" checksubmit();“即可。

  

(2)当提交按钮的类型属性为提交时:

  

设置按钮的onClick=" checksubmit(); ",并在& lt; form>标签中增加onsubmit=皉eturnfalse”。因为提交按钮的自动提交时在点击事件提交之后,将onsubmit设置为“returnfalse”,提交按钮的自动提交就会失效。

  

对于后面两种情况,可以使用会话解决,其原理是在运行添加信息页面时在会话中放置信息,然后页面提交信息给servlet处理,servlet获取会话中的信息,如果会话中有信息不为空则将信息插入数据库,然后删除会话中的信息,下次再提交表单时会话中的信息为空,那么则不执行存储信息过程。

  

但是单纯使用会话有其局限性,所以在实际开发中,一般使用利用会话结合UUID解决表单的重复提交,代码如下:

  

定义一个UuidToken类

        公开课UuidToken {   私有静态UuidToken UuidToken=new UuidToken ();   私人UuidToken () {   }   公共静态UuidToken getUuidToken () {   返回UuidToken;   }   公共字符串getUUIDAsStr同步(HttpServletRequest请求){   HttpSession会话=request.getSession ();   .toString字符串uuidStr=UUID.randomUUID () ();   如果(uuidStr !=null) {   session.setAttribute(“会话。uuid, uuidStr);   }   返回uuidStr;   }/* *   *判断会话中保存的uuid和jsp页面上的uuid是否相等   */公共同步布尔isUUIDValidate (HttpServletRequest请求){//获取已存在的会话   HttpSession会话=request.getSession(假);   如果(会话==null) {   返回错误;   }   字符串sessionuuid=(字符串)会话。getAttribute (“session.uuid”);   如果(sessionuuid==null) {   返回错误;   }   字符串htmluuid=request.getParameter (“html.uuid”);   如果(htmluuid==null) {   返回错误;   }   返回sessionuuid.equals (htmluuid);   }/* *   *删除uuid   */公共同步空白resetUUID (HttpServletRequest请求){   HttpSession会话=request.getSession(假);   如果(会话==null) {   返回;   }   session.removeAttribute (“session.uuid”);   }   }      

在jsp页面增加一个隐藏域,利用uuid生成一个唯一的标识号,赋给隐藏域,把唯一的标识号放置到会话中一份,代码如下:

        & lt;输入类型=耙亍眓ame=" html。uuid“价值=' https://www.yisu.com/zixun/'比;之前      

提交给servlet后,获取jsp页隐藏域的值,用隐藏域的值和会话中放置的值做比对,如果相同,保存数据并从会话中删除UUID、不相同则说明是重复提交,不进行处理。

        布尔标志=UuidToken.getUuidToken () .isUUIDValidate(请求);   如果(国旗){//保存信息到数据库//从会话删除uuid的   UuidToken.getUuidToken () .resetUUID(请求);   其他}{   System.out.println(“表单重复提交”);   }      

  

以上就是本文关于浅谈利用会话防止表单重复提交的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

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