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


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 相关文章推荐
use jscript Create a SQL Server database
Jun 16 Javascript
用函数模板,写一个简单高效的 JSON 查询器的方法介绍
Apr 17 Javascript
javascript实现点击后变换按钮显示文字的方法
May 13 Javascript
JS实现的仿淘宝交易倒计时效果
Nov 27 Javascript
jQuery选择器用法实例详解
Dec 17 Javascript
基于javascript实现文字无缝滚动效果
Mar 22 Javascript
jquery表单验证插件formValidator使用方法
Apr 01 Javascript
不同js异步函数同步的实现方法
May 28 Javascript
微信小程序 action-sheet底部菜单详解
Oct 27 Javascript
详解Vue.js搭建路由报错 router.map is not a function
Jun 27 Javascript
vue之a-table中实现清空选中的数据
Nov 07 Javascript
通过原生vue添加滚动加载更多功能
Nov 21 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中与数组相关的函数
2007/03/22 PHP
PHP设计模式之解释器模式的深入解析
2013/06/13 PHP
实现获取http内容的php函数分享
2014/02/16 PHP
php数组键值用法实例分析
2015/02/27 PHP
php preg_match的匹配不同国家语言实例
2016/12/29 PHP
php中get_magic_quotes_gpc()函数说明
2017/02/06 PHP
PHP读取Excel类文件
2017/05/15 PHP
PHP常见加密函数用法示例【crypt与md5】
2019/01/27 PHP
JQuery通过Ajax提交表单并返回结果
2011/07/31 Javascript
Javascript图像处理—虚拟边缘介绍及使用方法
2012/12/27 Javascript
jQuery+css+html实现页面遮罩弹出框
2013/03/21 Javascript
js中arguments的用法(实例讲解)
2013/11/30 Javascript
JS实现仿QQ聊天窗口抖动特效
2015/05/10 Javascript
5个最顶级jQuery图表类库插件【jquery插件库】
2016/05/05 Javascript
javascript实现的左右无缝滚动效果
2016/09/19 Javascript
js使用Replace结合正则替换重复出现的字符串功能示例
2016/12/27 Javascript
微信小程序 视图容器组件的详解及实例代码
2017/01/19 Javascript
JavaScript中数组Array.sort()排序方法详解
2017/03/01 Javascript
基于打包工具Webpack进行项目开发实例
2018/05/29 Javascript
使用webpack构建应用的方法步骤
2019/03/04 Javascript
js仿360开机效果
2019/12/26 Javascript
Windows下安装 node 的版本控制工具 nvm
2020/02/06 Javascript
使用Node.js实现base64和png文件相互转换的方法
2020/03/11 Javascript
Python中的rjust()方法使用详解
2015/05/19 Python
Django基础之Model操作步骤(介绍)
2017/05/27 Python
Django框架的中的setting.py文件说明详解
2018/10/15 Python
python生成器与迭代器详解
2019/01/01 Python
python简单实现9宫格图片实例
2020/09/03 Python
详解CSS3新增的背景属性
2019/12/25 HTML / CSS
Myprotein西班牙官网:欧洲第一大运动营养品牌
2020/02/24 全球购物
相亲大会策划方案
2014/06/05 职场文书
宿舍标语大全
2014/06/19 职场文书
地震慰问信
2015/02/14 职场文书
《只有一个地球》教学反思
2016/02/16 职场文书
党组织关系的介绍信模板
2019/06/21 职场文书
Python面向对象编程之类的概念
2021/11/01 Python