表单重复提交问题

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

为什么会发生表单重复提交呢?

网络延时

 在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交。

重新刷新

表单提交后用户点击【刷新】按钮导致表单重复提交

点击浏览器的【后退】按钮回退到表单页面后进行再次提交

用户提交表单后,点击浏览器的【后退】按钮回退到表单页面后进行再次提交

 

解决方案

使用javascript 解决

<script type="text/javascript">var isFlag = false; //表单是否已经提交标识,默认为falsefunction submitFlag() {if (!isFlag) {isFlag = true;return true;} else {return false;}}
</script>

2

function dosubmit(){//获取表单提交按钮var btnSubmit = document.getElementById("submit");//将表单提交按钮设置为不可用,这样就可以避免用户再次点击提交按钮btnSubmit.disabled= "disabled";//返回true让表单可以正常提交return true;
}

使用后端提交解决

 对于【场景二】和【场景三】导致表单重复提交的问题,既然客户端无法解决,那么就在服务器端解决,在服务器端解决就需要用到session了。

  具体的做法:在服务器端生成一个唯一的随机标识号,专业术语称为Token(令牌),同时在当前用户的Session域中保存这个Token。然后将Token发送到客户端的Form表单中,在Form表单中使用隐藏域来存储这个Token,表单提交的时候连同这个Token一起提交到服务器端,然后在服务器端判断客户端提交上来的Token与服务器端生成的Token是否一致,如果不一致,那就是重复提交了,此时服务器端就可以不处理重复提交的表单。如果相同则处理表单提交,处理完后清除当前用户的Session域中存储的标识号。
  在下列情况下,服务器程序将拒绝处理用户提交的表单请求:

1.       存储Session域中的Token(令牌)与表单提交的Token(令牌)不同。

2.       当前用户的Session中不存在Token(令牌)

3.       用户提交的表单数据中没有Token(令牌)

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Form表单</title></head><body><form action="${pageContext.request.contextPath}/DoFormServlet"method="post" onsubmit="return dosubmit()"><input type="hidden" name="token" value="${sesionToken}"> 用户名:<input type="text"name="userName"> <input type="submit" value="提交" id="submit"></form>
</body>
</html>
@WebServlet("/DoFormServlet")
public class DoFormServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("UTF-8");boolean flag = isFlag(req);if (!flag) {resp.getWriter().write("已经提交...");System.out.println("数据已经提交了..");return;}String userName = req.getParameter("userName");try {Thread.sleep(300);} catch (Exception e) {// TODO: handle exception}System.out.println("往数据库插入数据...." + userName);resp.getWriter().write("success");}public boolean isFlag(HttpServletRequest request) {HttpSession session = request.getSession();String sesionToken = (String) session.getAttribute("sesionToken");String token = request.getParameter("token");if (!(token.equals(sesionToken))) {return false;}session.removeAttribute("sesionToken");return true;}
}

简单来说:通过session吧sessionTonken传到前端,然后前端input使用隐藏域来保存sessionToken,name是tonken,在后台获取到sessionTonken和tonken的值,对比一下,第一次的时候肯定会true,然后就删除sessionTonken的值,第二次在对比一下,肯定是false了

转载于:https://my.oschina.net/u/3578766/blog/1605683

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/278625.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

chrome 网页重新加载_在Chrome中为各个网页设置自定义重新加载时间

chrome 网页重新加载Do you have a webpage that needs to be reloaded every so often or perhaps you have multiple webpages that each need their own individual reload time? Now you can have the best of both with the AutoReloader extension for Google Chrome. 您…

iphone解锁_有人可以用解锁的iPhone做的最糟糕的事情是什么?

iphone解锁Dedi Grigoroiu/Shutterstock.comDedi Grigoroiu / Shutterstock.comWe use our phones for event tickets, reservations, insurance cards, and even driver’s licenses. But what happens when someone takes your unlocked iPhone out of view for a moment—wh…

Alamofire源码导读二:发起请求及内部加锁的逻辑

以创建一个 DataRequest 为例子 &#xfffc; 发起请求 创建 SessionManager 顺带也创建了一个 SessionDelegate 持有一个urlSession&#xff0c;持有一个串行的 DispatchQueue A。注意&#xff0c;这个不是urlSession 回调方法执行时所在的OperationQueue 创建 Requestable 的…

bixby映射软件下载_如何在Samsung Galaxy S8,S9,S10,Note 8或Note 9上重新映射Bixby按钮...

bixby映射软件下载We’ve said before, and we’ll say it again: Bixby sucks. You’re better off using Google Assistant any day of the week. The good news is, it’s now possible to remap the pointless Bixby button without using a third-party app. 我们之前已经…

JavaScript数据结构和算法

前言 在过去的几年中&#xff0c;得益于Node.js的兴起&#xff0c;JavaScript越来越广泛地用于服务器端编程。鉴于JavaScript语言已经走出了浏览器&#xff0c;程序员发现他们需要更多传统语言&#xff08;比如C和Java&#xff09;提供的工具。这些工具包括传统的数据结构&…

如何使用Avira Rescue CD清洁感染的PC

When you’ve got a PC completely infected with viruses, sometimes it’s best to reboot into a rescue disc and run a full virus scan from there. Here’s how to use the Avira Rescue CD to clean an infected PC. 当您的PC完全感染了病毒时&#xff0c;有时最好重新…

Vue组件的三种调用方式

最近在写fj-service-system的时候&#xff0c;遇到了一些问题。那就是我有些组件&#xff0c;比如Dialog、Message这样的组件&#xff0c;是引入三方组件库&#xff0c;比如element-ui这样的&#xff0c;还是自己实现一个&#xff1f;虽然它们有按需引入的功能&#xff0c;但是…

火狐打印预览_将打印和打印预览命令添加到Firefox的上下文菜单

火狐打印预览Have you been thinking about how much easier it would be to having the Print & Print Preview commands in Firefox’s Context Menu? The Print Context Menu extension for Firefox allows you to avoid having to use the File Menu to access the pr…

《2017 云计算评测报告》:带你了解 AWS、阿里云、腾讯云等八家云计算服务提供商的综合用户体验情况...

报告电子版至听云官方博客下载&#xff1a;http://blog.tingyun.com/web/article/detail/1352 评测说明 评测目标&#xff1a;同一应用&#xff08;网站&#xff09;在不同云上的用户访问体验&#xff0c;以及对云资源的使用 洞察周期及范围&#xff1a;2017年4月-2017年9月 访…

python 新闻摘要_每日新闻摘要:Microsoft内部禁止应用程序,这样就可以了

python 新闻摘要Recently, a list of apps that Microsoft prohibits for internal employee use leaked, including Slack, Grammarly, and others. It’s tempting to think these are the actions of a company hating competition, but the truth is more complicated. 最近…

bootstrap评分插件 Bootstrap Star Rating Examples

http://www.jq22.com/demo/bootstrap-star-rating-master201708041812/ 转载于:https://www.cnblogs.com/waw/p/8288951.html

http 请求报文

1、报文 2、http请求方法 restful接口 post&#xff1a;创建 put&#xff1a;更新 转载于:https://www.cnblogs.com/mengfangui/p/10171559.html

chrome硬件加速_如何在Chrome中打开和关闭硬件加速

chrome硬件加速Google Chrome comes equipped with hardware acceleration, a feature which takes advantage of your computer’s GPU to speed up processes and free vital CPU time. However, sometimes driver incompatibilities can cause this feature to misbehave an…

如何在PowerPoint中制作三折

While Microsoft PowerPoint is almost exclusively used for presentation purposes, it’s also a great application for creating interesting and visually appealing brochures. Here’s how to create (and print out) a tri-fold using PowerPoint. 尽管Microsoft Powe…

如何在Chrome中为Gmail启用桌面通知

Last year Google rolled out desktop notifications for Google Calendar, now you can get Gmail and Gchat notifications on your desktop too. Read on as we walk you through configuring them both. 去年Google推出了Google日历的桌面通知&#xff0c;现在您也可以在桌…

vue集成iconfont、fontawesome和图标选择器(含fontawesome、el-icon和加入的iconfont)

目录&#xff08;一&#xff09;引入iconfont字体图标库将图标加入购物车新建&#xff08;添加至&#xff09;项目下载后项目中引入&#xff08;二&#xff09;引入fontawesome&#xff08;三&#xff09;图标选择器效果图结构使用源码&#xff08;一&#xff09;引入iconfont字…

java之Synchronize

2019独角兽企业重金招聘Python工程师标准>>> 实现原理&#xff1a;JVM 是通过进入、退出对象监视器( Monitor )来实现对方法、同步块的同步的。 具体实现是在编译之后在同步方法调用前加入一个 monitor.enter 指令&#xff0c;在退出方法和异常处插入 monitor.exit …

HikariCP连接池配置

2019独角兽企业重金招聘Python工程师标准>>> HikariCP号称性能最好的Java数据库连接池。虽没做过亲测但是公司项目一直在用&#xff0c;大概经历过2万左右用户同时在线&#xff0c;链接池性能方面未出现问题。 官网&#xff1a;http://brettwooldridge.github.io/Hi…

Microsoft Desktop Player是IT Pro的宝贵工具

If you are an IT Professional, a new education tool introduced by Microsoft is the MS Desktop Player. Today we take a look at what it has to offer, from Webcasts, White Papers, Training Videos, and more. 如果您是IT专业人员&#xff0c;则Microsoft推出的新的培…

如何在Microsoft Excel中将文本转换为日期值

Analysis of business data often requires working with date values in Excel to answer questions such as “how much money did we make today” or “how does this compare to the same day last week?” And that can be hard when Excel doesn’t recognize the valu…