详谈表单重复提交的三种情况及解决方法


Posted in Javascript onAugust 16, 2017

第一种情况:提交完表单以后,不做其他操作,直接刷新页面,表单会提交多次。

- 在servlet中写一句输出,用来判断是否提交多次

System.out.println("已经插入");
request.getRequestDispatcher("/login_success.jsp").forward(request, response);

- 这样的话,刷新多少次,就会在控制器显示多少个“已经插入”。

详谈表单重复提交的三种情况及解决方法

- 根本原因:Servlet处理完请求以后,直接转发到目标页面,这样整个业务只发送了一次请求,那么当你在浏览器中点击刷新会一直都会刷新之前的请求。

- 解决方法:不用转发到另一页面,采用重定向的方式跳转到目标页面

response.sendRedirect("/day0815-session/login_success.jsp");

详谈表单重复提交的三种情况及解决方法

第二种情况:在提交表单时,如果网速较差,可能会导致点击提交按钮多次,这种情况也会导致表单重复提交。

- 解决方法:点击提交按钮之后,使按钮不可用。通过js完成

<script type="text/javascript">
 window.onload = function(){ 
  //获取按钮的对象
  var btn = document.getElementById("btn");
  //为按钮绑定单击响应函数
  btn.onclick = function(){  
   //点击以后使按钮不可用
   this.disabled=true; 
   //当将提交按钮设置为不可用时,会自动取消它的默认行为
   //手动提交表单
   this.parentNode.submit(); 
  };
 };
</script><br><br><form action="${pageContext.request.contextPath }/SessionServlet" ><br>user:<input type="text" name="username"><br>password<input type="password" name="pwd"><br><input type="submit" value="提交" id="btn"> <br></form>

- 注意“提交”按钮,此时已经不可按!

详谈表单重复提交的三种情况及解决方法

第三种情况:表单提交成功以后,直接点击浏览器上回退按钮,不刷新页面,然后点击提交按钮再次提交表单。

- 根本原因:因为服务器在处理请求时,不会检查是否为重复提交的请求。

- 解决方案:

使用一个token的机制

- token就是令牌的意思

- 服务器在处理请求之前先来检查浏览器的token

- token由服务器来创建,并交给浏览器,浏览器在向服务器发送请求时需要带着这个token

- 服务器处理请求前检查token是否正确,如果正确,则正常处理,否则返回一个错误页面

- 服务器所创建的token只能使用一次

- token一般使用一个唯一的标识

- 在jsp页面,获取uuid作为token

- UUID:32位字符串,通常作为对象或者表的唯一标识,根据机器码和时间戳(从1970年1月1日开始到现在)生成。

<%
 String uuid = UUID.randomUUID().toString();
 session.setAttribute("uuid", uuid);
%><br>${errormsg }<br><form action="${pageContext.request.contextPath }/SessionServlet" ><br><input type="text" name="uuid" value="<%=uuid %>"/><br>
user:<input type="text" name="username"><br>
password<input type="password" name="pwd"><br>
<input type="submit" value="提交" "><br></form>

- 在servlet页面

String reqUUID = request.getParameter("uuid");
HttpSession session = request.getSession();
String sessUUID = (String) session.getAttribute("uuid");
session.removeAttribute("uuid");
  
if(reqUUID.equals(sessUUID)){
 response.sendRedirect(request.getContextPath()+"/login_success.jsp");
 System.out.println("已经插入");
}else{
 request.setAttribute("errormsg", "重复登陆");
 request.getRequestDispatcher("/3.jsp").forward(request, response);
}

- 表单重复提交的危害:

- 向数据库中插入大量的重复且没有意义的数据,占用服务器的资源

- 处理请求服务器并没有检查请求是否为重复的请求,导致恶意的攻击

以上这篇详谈表单重复提交的三种情况及解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript修改css样式style
Apr 15 Javascript
一个选择最快的服务器转向代码
Apr 27 Javascript
使用JQuery和s3captche实现一个水果名字的验证
Aug 14 Javascript
《JavaScript高级程序设计》阅读笔记(二) ECMAScript中的原始类型
Feb 27 Javascript
JS实现页面超时后自动跳转到登陆页面
Jan 19 Javascript
深入学习jQuery Validate表单验证
Jan 18 Javascript
JavaScript 正则表达式中global模式的特性
Feb 25 Javascript
Vue.js鼠标悬浮更换图片功能
May 17 Javascript
bootstrap table实现双击可编辑、添加、删除行功能
Sep 27 Javascript
jQuery.Sumoselect插件实现下拉复选框效果
Nov 09 jQuery
使用electron实现百度网盘悬浮窗口功能的示例代码
Oct 24 Javascript
JS实现水平遍历和嵌套递归操作示例
Aug 15 Javascript
详谈js对url进行编码和解码(三种方式的区别)
Aug 16 #Javascript
Node.js 的模块知识汇总
Aug 16 #Javascript
vue绑定设置属性的多种方式(5)
Aug 16 #Javascript
jQuery中each循环的跳出和结束实例
Aug 16 #jQuery
随机生成10个不重复的0-100的数字(实例讲解)
Aug 16 #Javascript
vue动态路由实现多级嵌套面包屑的思路与方法
Aug 16 #Javascript
基于js 本地存储(详解)
Aug 16 #Javascript
You might like
php学习 字符串课件
2008/06/15 PHP
仿Aspnetpager的一个PHP分页类代码 附源码下载
2012/10/08 PHP
PHP使用GIFEncoder类生成的GIF动态图片验证码
2014/07/01 PHP
PHP下载生成的csv文件及问题总结
2015/08/06 PHP
php版微信公众平台实现预约提交后发送email的方法
2016/09/26 PHP
php如何实现不借助IDE快速定位行数或者方法定义的文件和位置
2017/01/17 PHP
浅析PHP类的反射来实现依赖注入过程
2018/02/06 PHP
jQuery父级以及同级元素查找介绍
2013/09/04 Javascript
html文档中的location对象属性理解及常见的用法
2014/08/13 Javascript
js 加密压缩出现bug解决方案
2014/11/25 Javascript
JavaScript编程中window的location与history对象详解
2015/10/26 Javascript
详谈JS中数组的迭代方法和归并方法
2017/08/11 Javascript
vue.js如何将echarts封装为组件一键使用详解
2017/10/10 Javascript
JS实现的找零张数最小问题示例
2017/11/28 Javascript
vue中如何使用ztree
2018/02/06 Javascript
详解Vue This$Store总结
2018/12/17 Javascript
vue实现的请求服务器端API接口示例
2019/05/25 Javascript
小程序实现列表展开收起效果
2020/07/29 Javascript
前端如何实现动画过渡效果
2021/02/05 Javascript
[06:21]2014DOTA2国际邀请赛 庆祝VG首阶段领跑;B叔为挣牛排半夜整理情报
2014/07/13 DOTA
[01:13:18]Secret vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
netbeans7安装python插件的方法图解
2013/12/24 Python
Python中的CURL PycURL使用例子
2014/06/01 Python
tf.concat中axis的含义与使用详解
2020/02/07 Python
解决Keras TensorFlow 混编中 trainable=False设置无效问题
2020/06/28 Python
俄罗斯EPL钻石珠宝店:ЭПЛ
2019/10/22 全球购物
员工工作表扬信范文
2014/01/13 职场文书
优秀员工表扬信
2014/01/17 职场文书
老公给老婆的保证书
2014/04/28 职场文书
公司委托书格式
2014/08/01 职场文书
小学安全汇报材料
2014/08/14 职场文书
2014年纪检监察工作总结
2014/11/11 职场文书
学术研讨会欢迎词
2015/01/26 职场文书
幼儿园教师节活动总结
2015/03/23 职场文书
学校党支部公开承诺书
2015/04/30 职场文书
2015年中学图书馆工作总结
2015/07/22 职场文书