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


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 相关文章推荐
父窗口获取弹出子窗口文本框的值
Jun 27 Javascript
网站被黑的假象--ARP欺骗之页面中加入一段js
May 16 Javascript
js+CSS 图片等比缩小并垂直居中实现代码
Dec 01 Javascript
web页面数据展示新想法(json)
Jun 08 Javascript
基于jquery封装的一个js分页
Nov 15 Javascript
jquery删除提示框弹出是否删除对话框
Jan 07 Javascript
Node.js实现简单聊天服务器
Jun 20 Javascript
基于JavaScript将表单序列化类型的数据转化成对象的处理(允许对象中包含对象)
Dec 28 Javascript
JS实现鼠标滑过显示边框的菜单效果
Sep 21 Javascript
基于JS实现横线提示输入验证码随验证码输入消失(js验证码的实现)
Oct 27 Javascript
canvas压缩图片转换成base64格式输出文件流
Mar 09 Javascript
javascript中正则表达式语法详解
Aug 07 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_get_length缓冲与获取缓冲长度实例
2014/11/20 PHP
PHP中header用法小结
2016/05/23 PHP
PHP基础之输出缓冲区基本概念、原理分析
2019/06/19 PHP
PHP常用字符串输出方法分析(echo,print,printf及sprintf)
2021/03/09 PHP
用ADODB.Stream转换
2007/01/22 Javascript
JavaScript Memoization 让函数也有记忆功能
2011/10/27 Javascript
20款效果非常棒的 jQuery 插件小结分享
2011/11/18 Javascript
javascript打印输出json实例
2013/11/11 Javascript
使用JQ来编写最基本的淡入淡出效果附演示动画
2014/10/31 Javascript
关于JavaScript中事件绑定的方法总结
2016/10/26 Javascript
彻底解决 webpack 打包文件体积过大问题
2017/07/07 Javascript
Bootstrap table表格初始化表格数据的方法
2018/07/25 Javascript
Flutter部件内部状态管理小结之实现Vue的v-model功能
2019/06/11 Javascript
Js和VUE实现跑马灯效果
2020/05/25 Javascript
[00:12]2018DOTA2亚洲邀请赛 Sccc亮相SOLO赛,今年他又会有什么样的战绩?
2018/04/06 DOTA
Python使用base64模块进行二进制数据编码详解
2018/01/11 Python
numpy找出array中的最大值,最小值实例
2018/04/03 Python
python获取当前目录路径和上级路径的实例
2018/04/26 Python
python 实现返回一个列表中出现次数最多的元素方法
2019/06/11 Python
python路径的写法及目录的获取方式
2019/12/26 Python
NumPy统计函数的实现方法
2020/01/21 Python
Python使用sys.exc_info()方法获取异常信息
2020/07/23 Python
Python requests HTTP验证登录实现流程
2020/11/05 Python
Python关于拓扑排序知识点讲解
2021/01/04 Python
WINDOWS域的具体实现方式是什么
2014/02/20 面试题
现在输入n个数字,以逗号,分开;然后可选择升或者降序排序;按提交键就在另一页面显示按什么排序,结果为,提供reset
2012/11/09 面试题
优秀交警事迹材料
2014/01/26 职场文书
幼儿园保教管理制度
2014/02/03 职场文书
安全生产计划书
2014/05/04 职场文书
临床医学专业求职信
2014/08/08 职场文书
财务会计求职信范文
2015/03/20 职场文书
个人维稳承诺书
2015/05/04 职场文书
同事离别感言
2015/08/04 职场文书
《学会看病》教学反思
2016/02/17 职场文书
python爬取网页版QQ空间,生成各类图表
2021/06/02 Python
SpringBoot快速入门详解
2021/07/21 Java/Android