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


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 相关文章推荐
获取Javscript执行函数名称的方法
Dec 22 Javascript
jquery中输入验证中一个不错的效果
Aug 21 Javascript
jQuery+ajax实现鼠标单击修改内容的方法
Jun 27 Javascript
jQuery中prependTo()方法用法实例
Jan 08 Javascript
js函数内变量的作用域分析
Jan 12 Javascript
原生javascript实现的一个简单动画效果
Mar 30 Javascript
JavaScript中的this使用详解
Jul 27 Javascript
Javascript 实现计算器时间功能详解及实例(二)
Jan 08 Javascript
JS正则表达式判断有效数实例代码
Mar 13 Javascript
JavaScript仿微信(电话)联系人列表滑动字母索引实例讲解(推荐)
Aug 16 Javascript
element-ui 表格实现单元格可编辑的示例
Feb 26 Javascript
no-vnc和node.js实现web远程桌面的完整步骤
Aug 11 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
咖啡产品发展的三大浪潮
2021/03/04 咖啡文化
php去除数组中重复数据
2014/11/18 PHP
php生成高清缩略图实例详解
2015/12/07 PHP
CMSPRESS 10行代码搞定 PHP无限级分类2
2018/03/30 PHP
laravel 判断查询数据库返回值的例子
2019/10/11 PHP
location.search在客户端获取Url参数的方法
2010/06/08 Javascript
Chosen 基于jquery的选择框插件使用方法
2012/05/30 Javascript
js调用css属性写法
2013/09/21 Javascript
初识简单却不失优雅的Vue.js
2016/09/12 Javascript
详解基于 axios 的 Vue 项目 http 请求优化
2017/09/04 Javascript
AjaxUpLoad.js实现文件上传功能
2018/03/02 Javascript
angular4 共享服务在多个组件中数据通信的示例
2018/03/30 Javascript
jQuery插件实现非常实用的tab栏切换功能【案例】
2019/02/18 jQuery
vuex实现购物车功能
2020/06/28 Javascript
vue 保留两位小数 不能直接用toFixed(2) 的解决
2020/08/07 Javascript
python操作数据库之sqlite3打开数据库、删除、修改示例
2014/03/13 Python
在Python中使用cookielib和urllib2配合PyQuery抓取网页信息
2015/04/25 Python
Python输出9*9乘法表的方法
2015/05/25 Python
python+matplotlib绘制饼图散点图实例代码
2018/01/20 Python
Python进程间通信Queue实例解析
2018/01/25 Python
python 中的list和array的不同之处及转换问题
2018/03/13 Python
Python实现的从右到左字符串替换方法示例
2018/07/06 Python
python使用wxpy实现微信消息防撤回脚本
2019/04/29 Python
python+opencv实现摄像头调用的方法
2019/06/22 Python
Tensorflow中的降维函数tf.reduce_*使用总结
2020/04/20 Python
HTML5 canvas基本绘图之文字渲染
2016/06/27 HTML / CSS
Hotels.com爱尔兰:全球酒店预订
2017/02/24 全球购物
Java编程面试题
2016/04/04 面试题
自我鉴定怎么写
2013/12/05 职场文书
私人会所最新创业计划书范文
2014/03/24 职场文书
高校自主招生教师推荐信
2015/03/23 职场文书
电影地道战观后感
2015/06/04 职场文书
2015大一新生军训感言
2015/08/01 职场文书
详细了解java监听器和过滤器
2021/07/09 Java/Android
教你使用一行Python代码玩遍童年的小游戏
2021/08/23 Python
Win11局域网共享权限在哪里设置? Win11高级共享的设置技巧
2022/04/05 数码科技