解决项目中表单重复提交的问题,在平常的项目中有以下几种可能出现表单重复提交的情况,比如说:
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(“表单重复提交”); }
以上就是本文关于浅谈利用会话防止表单重复提交的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
浅谈利用会话防止表单重复提交