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


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中面向对象技术的模拟
Sep 25 Javascript
js 页面刷新location.reload和location.replace的区别小结
Dec 24 Javascript
jQuery中绑定事件的命名空间详解
Apr 05 Javascript
使用Jquery实现点击文字后变成文本框且可修改
Sep 21 Javascript
用jquery实现的一个超级简单的下拉菜单
May 18 Javascript
jquery中each遍历对象和数组示例
Aug 05 Javascript
js+CSS实现弹出居中背景半透明div层的方法
Feb 26 Javascript
网站申请不到支付宝接口、微信接口,免接口收款实现方式几种解决办法
Dec 14 Javascript
javascript容错处理代码(屏蔽js错误)
Jan 20 Javascript
D3.js进阶系列之CSV表格文件的读取详解
Jun 06 Javascript
JS实现的计数排序与基数排序算法示例
Dec 04 Javascript
vue+element加入签名效果(移动端可用)
Jun 17 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 和 COM
2006/10/09 PHP
PHP中for循环语句的几种变型
2007/03/16 PHP
js下函数般调用正则的方法附代码
2008/06/22 PHP
三个类概括PHP的五种设计模式
2012/09/05 PHP
PHP实现文件下载断点续传详解
2014/10/15 PHP
使用js正则控制input标签只允许输入的值
2013/07/29 Javascript
js arguments,jcallee caller用法总结
2013/11/30 Javascript
WEB前端开发都应知道的jquery小技巧及jquery三个简写
2015/11/15 Javascript
javascript中闭包(Closure)详解
2016/01/06 Javascript
使用Javascript实现选择下拉菜单互移并排序
2016/02/23 Javascript
jQuery简单实现title提示效果示例
2016/08/01 Javascript
浅谈JS之tagNaem和nodeName
2016/09/13 Javascript
js将table的每个td的内容自动赋值给其title属性的方法
2016/10/13 Javascript
从零开始学习Node.js系列教程之基于connect和express框架的多页面实现数学运算示例
2017/04/13 Javascript
JS鼠标滚动分页效果示例
2017/07/05 Javascript
VueJS事件处理器v-on的使用方法
2017/09/27 Javascript
JavaScript实现数值自动增加动画
2017/12/28 Javascript
React中如何引入Angular组件详解
2018/08/09 Javascript
D3.js(v3)+react 实现带坐标与比例尺的散点图 (V3版本)
2019/05/09 Javascript
python查找指定具有相同内容文件的方法
2015/06/28 Python
Python 数据处理库 pandas进阶教程
2018/04/21 Python
Python学习小技巧总结
2018/06/10 Python
python的依赖管理的实现
2019/05/14 Python
python实现复制文件到指定目录
2019/10/16 Python
pyinstaller还原python代码过程图解
2020/01/08 Python
关于多种方式完美解决Python pip命令下载第三方库的问题
2020/12/21 Python
老生常谈CSS中的长度单位
2016/06/27 HTML / CSS
JAVA和C++的区别
2013/10/06 面试题
ASP.NET中的身份验证有那些
2012/07/13 面试题
什么是方法的重载
2013/06/24 面试题
人力资源管理专业自荐书范文
2014/02/10 职场文书
电工技术比武方案
2014/05/11 职场文书
励志演讲稿800字
2014/08/21 职场文书
党的群众路线教育实践活动查摆剖析材料
2014/10/10 职场文书
初中作文评语集锦
2014/12/25 职场文书
保安辞职申请书应该怎么写?
2019/07/15 职场文书