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


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 loading效果代码
Jun 18 Javascript
js parsefloat parseint 转换函数
Jan 21 Javascript
在chrome中window.onload事件的一些问题
Mar 01 Javascript
基于jQuery的input输入框下拉提示层(自动邮箱后缀名)
Jun 14 Javascript
javascript break指定标签打破多层循环示例
Jan 20 Javascript
js自定义鼠标右键的实现原理及源码
Jun 23 Javascript
Jquery使用css方法改变样式实例
May 18 Javascript
浅谈jquery中next与siblings的区别
Oct 27 Javascript
使用vue实现点击按钮滑出面板的实现代码
Jan 10 Javascript
微信小程序 利用css实现遮罩效果实例详解
Jan 21 Javascript
Vue.js 2.0窥探之Virtual DOM到底是什么?
Feb 10 Javascript
Angular项目中$scope.$apply()方法的使用详解
Jul 26 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中OR与|| AND与&amp;&amp;的区别总结
2013/10/26 PHP
ThinkPHP的截取字符串函数无法显示省略号的解决方法
2014/06/25 PHP
php实现微信公众号主动推送消息
2015/12/31 PHP
PHP基于DOMDocument解析和生成xml的方法分析
2017/07/17 PHP
利用原生JavaScript获取元素样式只是获取而已
2014/10/08 Javascript
JavaScript设计模式之外观模式介绍
2014/12/28 Javascript
JavaScript对Cookie进行读写操作实例
2015/07/25 Javascript
JS 面向对象之继承---多种组合继承详解
2016/07/10 Javascript
详解使用grunt完成requirejs的合并压缩和js文件的版本控制
2017/03/02 Javascript
jQuery实现三级联动效果
2017/03/02 Javascript
TypeScript入门-接口
2017/03/30 Javascript
react native带索引的城市列表组件的实例代码
2017/08/08 Javascript
jquery中attr、prop、data区别与用法分析
2019/09/25 jQuery
微信小程序图片右边加两行文字的代码
2020/04/23 Javascript
python3图片转换二进制存入mysql
2013/12/06 Python
python实现随机密码字典生成器示例
2014/04/09 Python
python读写二进制文件的方法
2015/05/09 Python
Python实现的递归神经网络简单示例
2017/08/11 Python
Python函数any()和all()的用法及区别介绍
2018/09/14 Python
python把转列表为集合的方法
2019/06/28 Python
django框架使用方法详解
2019/07/18 Python
python的常见矩阵运算(小结)
2019/08/07 Python
python pygame实现挡板弹球游戏
2019/11/25 Python
Python函数参数类型及排序原理总结
2019/12/19 Python
PyTorch 普通卷积和空洞卷积实例
2020/01/07 Python
Python loguru日志库之高效输出控制台日志和日志记录
2020/03/07 Python
socket.io 和canvas 实现的共享画板功能
2019/05/22 HTML / CSS
HTML5 Canvas中使用路径描画二阶、三阶贝塞尔曲线
2015/01/01 HTML / CSS
世界上最大的乐器零售商:Guitar Center
2017/11/07 全球购物
西班牙拥有最佳品牌的动物商店:Animalear.com
2018/01/05 全球购物
出国签证在职证明
2014/01/16 职场文书
数学与统计学院学生个人职业生涯规划书
2014/02/10 职场文书
农业局学习党的群众路线教育实践活动心得体会
2014/03/07 职场文书
企业管理标语
2014/06/10 职场文书
签订劳动合同通知书
2015/04/16 职场文书
浅析Django接口版本控制
2021/06/26 Python