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


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中的new使用
Mar 20 Javascript
javascript延时加载之defer测试
Dec 28 Javascript
从QQ网站中提取的纯JS省市区三级联动菜单
Dec 25 Javascript
原生JS实现LOADING效果
Mar 16 Javascript
基于Bootstrap实现的下拉菜单手机端不能选择菜单项的原因附解决办法
Jul 22 Javascript
Bootstrap CSS组件之分页(pagination)和翻页(pager)
Dec 17 Javascript
bootstrap中日历范围选择插件daterangepicker的使用详解
Apr 17 Javascript
layer.confirm取消按钮绑定事件的方法
Aug 17 Javascript
Node.js的进程管理的深入理解
Jan 09 Javascript
javascript History对象原理解析
Feb 17 Javascript
js中火星坐标、百度坐标、WGS84坐标转换实现方法示例
Mar 02 Javascript
详解Vite的新体验
Feb 22 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新手上路(六)
2006/10/09 PHP
PR值查询 | PageRank 查询
2006/12/20 PHP
PHP + plupload.js实现多图上传并显示进度条加删除实例代码
2017/03/06 PHP
javascript编程起步(第六课)
2007/01/10 Javascript
JQuery 解析多维的Json数据格式
2009/11/02 Javascript
一起来写段JS drag拖动代码
2010/12/09 Javascript
有关于JS构造函数的重载和工厂方法
2013/04/07 Javascript
JS Date函数整理方便使用
2013/10/23 Javascript
Seajs的学习笔记
2014/03/04 Javascript
js触发select onchange事件的小技巧
2014/08/05 Javascript
Javascript中的迭代、归并方法详解
2016/06/14 Javascript
jquery.Callbacks的实现详解
2016/11/30 Javascript
BootStrap Table 获取同行不同列元素的方法
2016/12/19 Javascript
js实现华丽的九九乘法表效果
2017/03/29 Javascript
php简单数据库操作类的封装
2017/06/08 Javascript
使用vue-router设置每个页面的title方法
2018/02/11 Javascript
vue.js使用3DES加密的方法示例
2018/05/18 Javascript
微信小程序时间选择插件使用详解
2018/12/28 Javascript
用element的upload组件实现多图片上传和压缩的示例代码
2019/02/12 Javascript
Angular4.0动画操作实例详解
2019/05/10 Javascript
VUE脚手架具体使用方法
2019/05/20 Javascript
jQuery - AJAX load() 实例用法详解
2019/08/27 jQuery
[01:25:09]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第二场
2014/05/24 DOTA
[01:02:45]完美世界DOTA2联赛 LBZS vs Forest 第三场 11.07
2020/11/09 DOTA
python 正则表达式 概述及常用字符
2009/05/04 Python
Python+matplotlib+numpy绘制精美的条形统计图
2018/01/02 Python
python中hasattr()、getattr()、setattr()函数的使用
2019/08/16 Python
python数据预处理 :数据共线性处理详解
2020/02/24 Python
Python简单实现词云图代码及步骤解析
2020/06/04 Python
HTML5 video 事件应用示例
2014/09/11 HTML / CSS
养殖人员的创业计划书范文
2013/12/26 职场文书
《金钱的魔力》教学反思
2014/02/24 职场文书
二手房买卖协议书
2014/04/10 职场文书
房屋出租协议书范本(标准版)
2014/09/24 职场文书
医院保洁员管理制度
2015/08/05 职场文书
MySql学习笔记之事务隔离级别详解
2021/05/12 MySQL