最近几天,知识星球在升级,所以知识星球里的内容也无法更新。但是也有一些初学者,问我一些简单的表单重复提交问题。
这个问题其实很简单,但是我身边有几个同事回答的并不算完美,于是我觉得该给各位科普一下,让大家在面试中不吃亏。
表单重复提交其实有 3 种常见的场景。第一种就是,在前端多次点击里体检按钮。
由于网络延迟,或者系统突然响应缓慢,也或者表单提交者手速快进行了多次点击导致整个表单被重复提交。
第二种场景就是,用户在前端刷新页面,导致表达重复提交。
第三种场景就是,利用浏览器的后腿按钮,重复之前的提交操作导致数据被再次重复提交。
虽然这 3 种场景看似都发送在前端。但解决这种问题最好是前端后端都做一下校验。
前端的话,就很好解决了,用户点击提交按钮后,你就把提交按钮给禁用掉,灰显。
但这种做法有点治标不治本,按钮虽然被禁用掉了。但是如果我刷新网页,post 请求就会再次被提交。
所以,服务器也要加一限制。怎么限制呢?就是在显示表单的时候,我生成一个 token,放在表单里。然后你提交表单时把 token 带上。如果,Session 域中的 Token(令牌)与表单提交的 Token(令牌)不同,或者当前用户的 Session 中不存在Token(令牌),也或者用户提交的表单数据中没有 Token(令牌),那么都算重复提交。

代码我就忽略不写了,非常的简单。

最后,我再介绍一种模式, Post-Redirect-Get (PRG)模式。看名字就应该知道,它是在你 post 提交后,重定向到 get 请求。
什么意思呢?就是当用户提交了表单后,我们给客户端一个重定向,转到提交成功信息页面。 这能避免用户按 F5 导致的重复提交,而其也不会出现浏览器表单重复提交的警告,也能消除按浏览器前进和后退按导致的同样问题。
以上,希望能够帮助到大家的面试。
: » 表单重复提交的3种场景与解决方案
原创文章,作者:3628473679,如若转载,请注明出处:https://blog.ytso.com/tech/java/252075.html