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


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 相关文章推荐
jquery ajax 登录验证实现代码
Sep 23 Javascript
jquery之超简单的div显示和隐藏特效demo(分享)
Jul 09 Javascript
JSON传递bool类型数据的处理方式介绍
Sep 18 Javascript
jQuery 取值、赋值的基本方法整理
Mar 31 Javascript
JS中JSON对象和String之间的互转及处理技巧
Apr 06 Javascript
JavaScript之浏览器对象_动力节点Java学院整理
Jul 03 Javascript
VUE axios发送跨域请求需要注意的问题
Jul 06 Javascript
swiper插件自定义切换箭头按钮
Dec 28 Javascript
关于Layui Table隐藏列问题
Sep 16 Javascript
JS实现的定时器展示简单秒表、页面弹框及跳转操作完整示例
Jan 26 Javascript
javaScript 实现重复输出给定的字符串的常用方法小结
Feb 20 Javascript
vue实现省市区联动 element-china-area-data插件
Apr 22 Vue.js
详谈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 301转向实现代码
2008/09/18 PHP
深入理解PHP中的Session和Cookie
2013/06/21 PHP
PHP提示Warning:phpinfo() has been disabled函数禁用的解决方法
2014/12/17 PHP
smarty模板引擎基础知识入门
2015/03/30 PHP
使用PHP如何实现高效安全的ftp服务器(一)
2015/12/20 PHP
php对接java现实加签验签的实例
2016/11/25 PHP
PHP7.1实现的AES与RSA加密操作示例
2018/06/15 PHP
将两个div左右并列显示并实现点击标题切换内容
2013/10/22 Javascript
javascript文件中引用依赖的js文件的方法
2014/03/17 Javascript
js 实现的可折叠留言板(附源码下载)
2014/07/01 Javascript
node.js集成百度UE编辑器
2015/02/05 Javascript
jQuery删除一个元素后淡出效果展示删除过程的方法
2015/03/18 Javascript
jquery中toggle函数交替使用问题
2015/06/22 Javascript
jquery UI Datepicker时间控件的使用方法(终结版)
2015/11/07 Javascript
微信小程序 网络请求(GET请求)详解
2016/11/16 Javascript
jQuery实现ajax无刷新分页页码控件
2017/02/28 Javascript
Linux系统中利用node.js提取Word(doc/docx)及PDF文本的内容
2017/06/17 Javascript
Vue父子模版传值及组件传值的三种方法
2017/11/27 Javascript
详解js类型判断
2018/05/22 Javascript
详解vue-router 初始化时做了什么
2018/06/11 Javascript
React中使用async validator进行表单验证的实例代码
2018/08/17 Javascript
PM2自动部署代码步骤流程总结
2018/12/10 Javascript
vue实现页面滚动到底部刷新
2019/08/16 Javascript
详解JS函数防抖
2020/06/05 Javascript
[03:02]安得倚天剑,跨海斩长鲸——中国军团出征DOTA2国际邀请赛
2018/08/14 DOTA
Python快速从注释生成文档的方法
2016/12/26 Python
Pyinstaller打包Scrapy项目的实现步骤
2020/09/22 Python
python使用scapy模块实现ping扫描的过程详解
2021/01/21 Python
纯css实现照片墙3D效果的示例代码
2017/11/13 HTML / CSS
法律专业自我鉴定
2013/10/03 职场文书
土木工程专业个人求职信
2013/12/05 职场文书
元宵节主持词
2014/03/25 职场文书
中学生教师节演讲稿
2014/09/03 职场文书
2016新党章学习心得体会
2016/01/15 职场文书
小学英语新课改心得体会
2016/01/22 职场文书
Redis读写分离搭建的完整步骤
2021/09/14 Redis