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

发布时间 - 2026-01-11 02:48:39    点击率:

第一种情况:提交完表单以后,不做其他操作,直接刷新页面,表单会提交多次。

- 在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);
}

- 表单重复提交的危害:

- 向数据库中插入大量的重复且没有意义的数据,占用服务器的资源

- 处理请求服务器并没有检查请求是否为重复的请求,导致恶意的攻击

以上这篇详谈表单重复提交的三种情况及解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# 表单重复提交  # js防止表单重复提交的两种方法  # 常见表单重复提交问题整理及解决方法  # php解决和避免form表单重复提交的几种方法  # 几种防止表单重复提交的方法  # js防止表单重复提交实现代码  # 一个JavaScript防止表单重复提交的实例  # JSP刷新页面表单重复提交问题解决办法分享  # 表单  # 解决方法  # 给大家  # 不可用  # 根本原因  # 也会  # 一句  # 令牌  # 你在  # 会在  # 希望能  # 三种  # 这种情况  # 上回  # 不做  # 这篇  # 设置为  # 可按  # 送了  # 要带 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  简单实现Android文件上传  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  C#如何调用原生C++ COM对象详解  实现点击下箭头变上箭头来回切换的两种方法【推荐】  如何快速搭建高效香港服务器网站?  原生JS获取元素集合的子元素宽度实例  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  如何用景安虚拟主机手机版绑定域名建站?  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  香港服务器租用每月最低只需15元?  网站制作壁纸教程视频,电脑壁纸网站?  EditPlus中的正则表达式 实战(1)  新三国志曹操传主线渭水交兵攻略  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析  如何在阿里云香港服务器快速搭建网站?  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】  lovemo网页版地址 lovemo官网手机登录  php 三元运算符实例详细介绍  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  详解MySQL数据库的安装与密码配置  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用  Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率  怎么用AI帮你设计一套个性化的手机App图标?  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  在线教育网站制作平台,山西立德教育官网?  Laravel如何生成API文档?(Swagger/OpenAPI教程)  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  Java解压缩zip - 解压缩多个文件或文件夹实例  三星、SK海力士获美批准:可向中国出口芯片制造设备  七夕网站制作视频,七夕大促活动怎么报名?  如何获取免费开源的自助建站系统源码?  如何在IIS中新建站点并解决端口绑定冲突?  再谈Python中的字符串与字符编码(推荐)  如何快速登录WAP自助建站平台?  SQL查询语句优化的实用方法总结  Laravel如何使用Vite进行前端资源打包?(配置示例)  Python制作简易注册登录系统  Laravel如何使用Livewire构建动态组件?(入门代码)  Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程  网站页面设计需要考虑到这些问题  Laravel如何实现全文搜索功能?(Scout和Algolia示例)