本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
最近几天,知识星球在升级,所以知识星球里的内容也无法更新。但是也有一些初学者,问我一些简单的表单重复提交问题。
这个问题其实很简单,但是我身边有几个同事回答的并不算完美,于是我觉得该给各位科普一下,让大家在面试中不吃亏。
表单重复提交其实有 3 种常见的场景。第一种就是,在前端多次点击里体检按钮。
由于网络延迟,或者系统突然响应缓慢,也或者表单提交者手速快进行了多次点击导致整个表单被重复提交。
第二种场景就是,用户在前端刷新页面,导致表达重复提交。
第三种场景就是,利用浏览器的后腿按钮,重复之前的提交操作导致数据被再次重复提交。
虽然这 3 种场景看似都发送在前端。但解决这种问题最好是前端后端都做一下校验。
前端的话,就很好解决了,用户点击提交按钮后,你就把提交按钮给禁用掉,灰显。
但这种做法有点治标不治本,按钮虽然被禁用掉了。但是如果我刷新网页,post 请求就会再次被提交。
所以,服务器也要加一限制。怎么限制呢?就是在显示表单的时候,我生成一个 token,放在表单里。然后你提交表单时把 token 带上。如果,Session 域中的 Token(令牌)与表单提交的 Token(令牌)不同,或者当前用户的 Session 中不存在Token(令牌),也或者用户提交的表单数据中没有 Token(令牌),那么都算重复提交。
代码我就忽略不写了,非常的简单。
最后,我再介绍一种模式, Post-Redirect-Get (PRG)模式。看名字就应该知道,它是在你 post 提交后,重定向到 get 请求。
什么意思呢?就是当用户提交了表单后,我们给客户端一个重定向,转到提交成功信息页面。 这能避免用户按 F5 导致的重复提交,而其也不会出现浏览器表单重复提交的警告,也能消除按浏览器前进和后退按导致的同样问题。
以上,希望能够帮助到大家的面试。
最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!
本文原文出处:业余草: » 表单重复提交的3种场景与解决方案