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


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 相关文章推荐
利用404错误页面实现UrlRewrite的实现代码
Aug 20 Javascript
javascript Select标记中options操作方法集合
Oct 22 Javascript
JavaScript 学习笔记(六)
Dec 31 Javascript
jquery validation插件表单验证的一个例子
Mar 03 Javascript
jquery仿QQ商城带左右按钮控制焦点图片切换滚动效果
Jun 27 Javascript
Egret引擎开发指南之运行项目
Sep 03 Javascript
javascript删除一个html元素节点的方法
Dec 20 Javascript
javascript上下方向键控制表格行选中并高亮显示的方法
Feb 13 Javascript
深入理解Vuex 模块化(module)
Sep 26 Javascript
Vue中的无限加载vue-infinite-loading的方法
Apr 08 Javascript
JS html事件冒泡和事件捕获操作示例
May 01 Javascript
vue.js 使用原生js实现轮播图
Apr 26 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
将数组写入txt文件 var_export
2009/04/21 PHP
新浪SAE云平台下使用codeigniter的数据库配置
2014/06/12 PHP
PHP使用gmdate实现将一个UNIX 时间格式化成GMT文本的方法
2015/03/19 PHP
php文件系统处理方法小结
2016/05/23 PHP
PHP图形计数器程序显示网站用户浏览量
2016/07/20 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
2017/12/21 PHP
PHP安装扩展mcrypt以及相关依赖项深入讲解
2021/03/04 PHP
从零学JS之你需要了解的几本书
2014/05/19 Javascript
jQuery中:not选择器用法实例
2014/12/30 Javascript
js利用正则表达式检验输入内容是否为网址
2016/07/05 Javascript
怎样判断jQuery当前元素是隐藏还是显示
2016/11/23 Javascript
JavaScript实现的搜索及高亮显示功能示例
2017/08/14 Javascript
原生JS实现获取及修改CSS样式的方法
2018/09/04 Javascript
vue-cli3中vue.config.js配置教程详解
2019/05/29 Javascript
Nodejs监控事件循环异常示例详解
2019/09/22 NodeJs
微信小程序实现音频文件播放进度的实例代码
2020/03/02 Javascript
[04:29]【TI9采访】OG.N0tail在胜者组决赛后接受采访
2019/08/25 DOTA
Python文件及目录操作实例详解
2015/06/04 Python
简介Django框架中可使用的各类缓存
2015/07/23 Python
详解JavaScript编程中的window与window.screen对象
2015/10/26 Python
python使用Flask操作mysql实现登录功能
2018/05/14 Python
Windows 8.1 64bit下搭建 Scrapy 0.22 环境
2018/11/18 Python
浅谈python实现Google翻译PDF,解决换行的问题
2018/11/28 Python
Python实现的逻辑回归算法示例【附测试csv文件下载】
2018/12/28 Python
使用python3实现操作串口详解
2019/01/01 Python
numpy 返回函数的上三角矩阵实例
2019/11/25 Python
基于pytorch 预训练的词向量用法详解
2020/01/06 Python
canvas实现手机的手势解锁的步骤详细
2020/03/16 HTML / CSS
客服文员岗位职责
2013/11/29 职场文书
本科毕业生求职自荐信
2014/04/09 职场文书
大学生自荐书范文
2015/03/05 职场文书
小学生组织委员竞选稿
2015/11/21 职场文书
导游词之寿县报恩寺
2020/01/19 职场文书
新手入门Mysql--概念
2021/06/18 MySQL
idea搭建可运行Servlet的Web项目
2021/06/26 Java/Android
Win11任务栏太宽了怎么办?一招解决Win11任务栏太宽问题
2021/11/21 数码科技