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


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广告实现代码
Nov 17 Javascript
js select option对象小结
Dec 20 Javascript
js操作模态窗口及父子窗口间相互传值示例
Jun 09 Javascript
checkbox选中与未选中判断示例
Aug 04 Javascript
leaflet的开发入门教程
Nov 17 Javascript
Bootstrap Multiselect 常用组件实现代码
Jul 09 Javascript
JS获取字符对应的ASCII码实例
Sep 10 Javascript
JS小球抛物线轨迹运动的两种实现方法详解
Dec 20 Javascript
说说node中的可读流和可写流的区别
Jun 01 Javascript
React项目动态设置title标题的方法示例
Sep 26 Javascript
react 中父组件与子组件双向绑定问题
May 20 Javascript
浅谈对于“不用setInterval,用setTimeout”的理解
Aug 28 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 ob_start()控制浏览器cache、生成html实现代码
2010/02/16 PHP
CI框架安全类Security.php源码分析
2014/11/04 PHP
php基于Snoopy解析网页html的方法
2015/07/09 PHP
php json中文编码为null的解决办法
2016/12/14 PHP
JavaScript面向对象之静态与非静态类
2010/02/03 Javascript
基于jquery的让页面控件不可用的实现代码
2010/04/27 Javascript
弹出层之1:JQuery.Boxy (一) 使用介绍
2011/10/06 Javascript
jQuery $.get 的妙用 访问本地文本文件
2012/07/12 Javascript
javascript禁用Tab键脚本实例
2013/11/22 Javascript
通过pjax实现无刷新翻页(兼容新版jquery)
2014/01/31 Javascript
二叉树的非递归后序遍历算法实例详解
2014/02/07 Javascript
Bootstrap Fileinput文件上传组件用法详解
2016/05/10 Javascript
jQuery插件Easyui设置datagrid的pageNumber导致两次请求问题的解决方法
2016/08/06 Javascript
Bootstrap模态框禁用空白处点击关闭
2016/10/20 Javascript
JS解决position:sticky的兼容性问题的方法
2017/10/17 Javascript
详解webpack 打包文件体积过大解决方案(code splitting)
2018/04/10 Javascript
浅谈Webpack下多环境配置的思路
2018/06/27 Javascript
JS/jQuery实现简单的开关灯效果【案例】
2019/02/19 jQuery
python实现微信发送邮件关闭电脑功能
2018/02/22 Python
Python 找到列表中满足某些条件的元素方法
2018/06/26 Python
pycharm的console输入实现换行的方法
2019/01/16 Python
kali中python版本的切换方法
2019/07/11 Python
通过实例简单了解Python中yield的作用
2019/12/11 Python
Python 利用OpenCV给照片换底色的示例代码
2020/08/03 Python
玩转CSS3色彩
2010/01/16 HTML / CSS
HTML5上传文件显示进度的实现代码
2012/08/30 HTML / CSS
英国最大的老式糖果店:A Quarter Of
2017/04/08 全球购物
美国班级戒指、帽子和礼服、毕业产品、年鉴:Balfour
2018/11/01 全球购物
Laura Geller官网:美国彩妆品牌
2018/12/29 全球购物
jQuery treeview树形结构应用
2021/03/24 jQuery
计算机开发个人求职信范文
2013/09/26 职场文书
零件设计自荐信范文
2013/11/27 职场文书
小学教师师德师风演讲稿
2014/08/22 职场文书
JavaScript中MutationObServer监听DOM元素详情
2021/11/27 Javascript
SpringCloud Feign请求头删除修改的操作代码
2022/03/20 Java/Android
TypeScript 内置高级类型编程示例
2022/09/23 Javascript