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


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脚本编程解决考试分数统计问题
Oct 18 Javascript
JavaScript 继承的实现
Jul 09 Javascript
SlideView 图片滑动(扩展/收缩)展示效果
Aug 01 Javascript
JS获取图片实际宽高及根据图片大小进行自适应
Aug 11 Javascript
jquery Ajax 实现加载数据前动画效果的示例代码
Feb 07 Javascript
JavaScript控制各种浏览器全屏模式的方法、属性和事件介绍
Apr 03 Javascript
自定义jQuery插件方式实现强制对象重绘的方法
Mar 23 Javascript
window.onload与$(document).ready()的区别分析
May 30 Javascript
如何实现JavaScript动态加载CSS和JS文件
Dec 28 Javascript
使用jQuery.Qrcode插件在客户端动态生成二维码并添加自定义Logo
Sep 01 Javascript
利用iscroll4实现轮播图效果实例代码
Jan 11 Javascript
微信小程序wx:for和wx:for-item的用法详解
Apr 01 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数组中的重复值的实现代码
2011/07/17 PHP
PHP生成树的方法
2015/07/28 PHP
thinkPHP微信分享接口JSSDK用法实例
2017/07/07 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
2017/11/13 PHP
PHP面向对象程序设计之对象的遍历操作示例
2019/06/12 PHP
AeroWindow 基于JQuery的弹出窗口插件
2011/06/27 Javascript
JavaScript获取FCK编辑器信息的具体方法
2013/07/12 Javascript
仿谷歌主页js动画效果实现代码
2013/07/14 Javascript
页面实时更新时间的JS实例代码
2013/12/18 Javascript
js实现禁止中文输入的方法
2015/01/14 Javascript
JS实现在状态栏显示打字效果完整实例
2015/11/02 Javascript
jquery自动补齐功能插件flexselect用法示例
2016/08/06 Javascript
jQuery中clone()函数实现表单中增加和减少输入项
2017/05/13 jQuery
webpack打包node.js后端项目的方法
2018/03/10 Javascript
JS内部事件机制之单线程原理
2018/07/02 Javascript
Vue封装的可编辑表格插件方法
2018/08/28 Javascript
深入理解与使用keep-alive(配合router-view缓存整个路由页面)
2018/09/25 Javascript
JS加载解析Markdown文档过程详解
2020/05/19 Javascript
JS简易计算器实例讲解
2020/06/30 Javascript
Python Requests安装与简单运用
2016/04/07 Python
Python的包管理器pip更换软件源的方法详解
2016/06/20 Python
Python对象类型及其运算方法(详解)
2017/07/05 Python
python skimage 连通性区域检测方法
2018/06/21 Python
解决python读取几千万行的大表内存问题
2018/06/26 Python
python中ASCII码和字符的转换方法
2018/07/09 Python
Python 字符串换行的多种方式
2018/09/06 Python
python实现串口自动触发工作的示例
2019/07/02 Python
Python递归调用实现数字累加的代码
2020/02/25 Python
解决启动django,浏览器显示“服务器拒绝访问”的问题
2020/05/13 Python
C#里面如何倒序排列一个数组的元素?
2013/06/21 面试题
项目投资意向书
2014/04/01 职场文书
成立公司计划书
2014/05/07 职场文书
农业项目投资意向书
2015/05/09 职场文书
小学总务工作总结
2015/08/13 职场文书
个人工作失误的保证书怎么写?
2019/06/21 职场文书
如何利用Matlab制作一款真正的拼图小游戏
2021/05/11 Python