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


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背投广告代码的完善
Apr 08 Javascript
JavaScript 在各个浏览器中执行的耐性
Apr 06 Javascript
extjs 3.31 TreeGrid实现静态页面加载json到TreeGrid里面
Apr 02 Javascript
js仿百度有啊通栏展示效果实现代码
May 28 Javascript
JS判断对象是否存在的10种方法总结
Dec 23 Javascript
基于jQuery和CSS3制作数字时钟附源码下载(jquery篇)
Nov 24 Javascript
Web Uploader文件上传插件使用详解
May 10 Javascript
JS判断日期格式是否合法的简单实例
Jul 11 Javascript
微信小程序中使用javascript 回调函数
May 11 Javascript
vue router下的html5 history在iis服务器上的设置方法
Oct 18 Javascript
vuejs数据超出单行显示更多,点击展开剩余数据实例
May 05 Javascript
Vue获取微博授权URL代码实例
Nov 04 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
Breeze 文章管理系统 v1.0.0正式发布
2006/12/14 PHP
PHP 截取字符串函数整理(支持gb2312和utf-8)
2010/02/16 PHP
按上下级层次关系输出内容的PHP代码
2010/07/17 PHP
fgetcvs在linux的问题
2012/01/15 PHP
php错误级别的设置方法
2013/06/17 PHP
ThinkPHP标签制作教程
2014/07/10 PHP
PHP回溯法解决0-1背包问题实例分析
2015/03/23 PHP
利用PHP抓取百度阅读的方法示例
2016/12/18 PHP
[原创]php正则删除img标签的方法示例
2017/05/27 PHP
PHP实现本地图片转base64格式并上传
2020/05/29 PHP
Jquery操作Select 简单方便 一个js插件搞定
2009/11/12 Javascript
jQuery ajax serialize()方法的使用以及常见问题解决
2013/01/27 Javascript
js实现网站首页图片滚动显示
2013/02/04 Javascript
js中的push和join方法使用介绍
2013/10/08 Javascript
如何在Angular.JS中接收并下载PDF
2016/11/26 Javascript
JS实现给json数组动态赋值的方法示例
2020/03/19 Javascript
bootstrap3-dialog-master模态框使用详解
2017/08/22 Javascript
vue底部加载更多的实例代码
2018/06/29 Javascript
React中如何引入Angular组件详解
2018/08/09 Javascript
vue中各种通信传值方式总结
2019/02/14 Javascript
JavaScript实现简易聊天对话框(加滚动条)
2020/02/10 Javascript
Python实现的读取电脑硬件信息功能示例
2018/05/30 Python
Pandas之groupby( )用法笔记小结
2019/07/23 Python
浅谈pymysql查询语句中带有in时传递参数的问题
2020/06/05 Python
一款利用css3的鼠标经过动画显示详情特效的实例教程
2014/12/29 HTML / CSS
怎样实现H5+CSS3手指滑动切换图片的示例代码
2019/05/05 HTML / CSS
介绍一下ICMP(Internet Control Message Protocol)Internet控制信息协议
2016/11/26 面试题
拓展培训心得体会
2014/01/04 职场文书
工作疏忽检讨书
2014/01/25 职场文书
幼儿老师求职信
2014/06/30 职场文书
赔偿协议书范本
2014/09/12 职场文书
银行先进个人总结
2015/02/15 职场文书
党支部综合考察意见
2015/06/01 职场文书
Python探索生命起源 matplotlib细胞自动机动画演示
2022/04/21 Python
nginx 配置指令之location使用详解
2022/05/25 Servers
MySQL新手入门进阶语句汇总
2022/09/23 MySQL