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


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贪吃蛇完整版(源码)
Dec 09 Javascript
用js判断输入是否为中文的函数
Mar 10 Javascript
使用ES6语法重构React代码详解
May 09 Javascript
老生常谈JavaScript面向对象基础与this指向问题
Oct 16 Javascript
ES6中Class类的静态方法实例小结
Oct 28 Javascript
微信小程序中this.data与this.setData的区别详解
Sep 17 Javascript
解决vue移动端适配问题
Dec 12 Javascript
微信小程序控制台提示warning:Now you can provide attr &quot;wx:key&quot; for a &quot;wx:for&quot; to improve performance解决方法
Feb 21 Javascript
layui文件上传控件带更改后数据传值的方法
Sep 23 Javascript
用Node写一条配置环境的指令
Nov 14 Javascript
原生js实现html手机端城市列表索引选择城市
Jun 24 Javascript
jquery实现鼠标悬浮弹出气泡提示框
Dec 23 jQuery
详谈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
第三节--定义一个类
2006/11/16 PHP
golang、python、php、c++、c、java、Nodejs性能对比
2017/03/12 NodeJs
为jquery.ui.dialog 增加“在当前鼠标位置打开”的功能
2009/11/24 Javascript
通过百度地图获取公交线路的站点坐标的js代码
2012/05/11 Javascript
Jquery判断$(&quot;#id&quot;)获取的对象是否存在的方法
2013/09/25 Javascript
Javascript实现页面跳转的几种方式分享
2013/10/26 Javascript
javascript页面渲染速度测试脚本分享
2014/04/15 Javascript
js对象内部访问this修饰的成员函数示例
2014/04/27 Javascript
jQuery学习笔记之 Ajax操作篇(三) - 过程处理
2014/06/23 Javascript
WordPress中利用AJAX异步获取评论用户头像的方法
2016/01/08 Javascript
JS函数节流和函数防抖问题分析
2017/12/18 Javascript
vue scroller返回页面记住滚动位置的实例代码
2018/01/29 Javascript
vue.js的双向数据绑定Object.defineProperty方法的神奇之处
2019/01/18 Javascript
9102了,你还不会移动端真机调试吗
2019/03/25 Javascript
Vuex的actions属性的具体使用
2019/04/14 Javascript
解决vue 单文件组件中样式加载问题
2019/04/24 Javascript
Vue实现浏览器打印功能的代码
2020/04/17 Javascript
JS轮播图的实现方法2
2020/08/25 Javascript
[01:59]深扒TI7聊天轮盘语音出处 1
2017/05/11 DOTA
跟老齐学Python之玩转字符串(2)更新篇
2014/09/28 Python
深入理解Python 关于supper 的 用法和原理
2018/02/28 Python
Python实现判断一个整数是否为回文数算法示例
2019/03/02 Python
Python爬虫爬取微信朋友圈
2020/08/06 Python
一些常用的HTML5模式(pattern) 总结
2015/07/14 HTML / CSS
英国天然有机美容护肤品:Neal’s Yard Remedies
2018/05/05 全球购物
理工大学毕业生自荐信
2013/11/01 职场文书
工程总经理工作职责
2013/12/09 职场文书
美容院营销方案
2014/03/05 职场文书
刊首寄语大全
2014/04/11 职场文书
合伙协议书
2014/04/23 职场文书
参观邀请函范文
2015/02/02 职场文书
2015年文员个人工作总结
2015/04/09 职场文书
干货干货!2019最新优秀创业计划书
2019/03/21 职场文书
Redisson实现Redis分布式锁的几种方式
2021/08/07 Redis
详解JAVA的控制语句
2021/11/11 Java/Android
详解在OpenCV中如何使用图像像素
2022/03/03 Python