文章目录
日常开发中,增删改查的需求不可避免,表单提交业务不知凡几,防止表单重复提交势在必行,引起重复提交的情况如下:
1、提交按钮误操作点击两次
2、后端网络请求响应缓慢
3、点击提交后的刷新按钮
4、浏览器后退按钮,重复提交表单
5、浏览器重复的HTTP请求
我们可以从前端和服务端拦截重复提交的操作。
项目:https://gitee.com/chenershuai/jsp-spring.git
一、前端拦截
1.1 提交按钮不可用
1、表单提交后javascript
禁用提交按钮,或者表单提交后解绑按钮上click事件
1.2 按钮倒计时
页面提交表单后,提交按钮置灰不可点击加入倒计时,比如5秒或者10秒后恢复可提交状态
1.3 ajax提交加锁
采用ajax方式提交表单时,设置一个布尔变量(true/false),未提交前设置为true,提交后设置为false,服务端响应结果没有回来之前保持false,正常响应时再置为true。
1.4 提交后重定向到一个提交成功的页面
表单提交后跳转到另外一个成功页面。用户刷新避免重复提交.
具体代码见项目中com.example.ReSubmitController#savePRG
二、后端拦截
2.1 token
用户访问表单页面,服务器生成 token 存入session和request中,token放入页面 hidden 标签中;提交表单时服务器比对页面参数token和session中token,如果一致,提交表单数据并删除session中的token值; 如果重复提交了,token不一致,提示不可重复提交。
2.2 Cookie 记录token
和session中存储token类似
2.3 缓存
缓存提交数据,比对下一次提交的数据,如果一致,则为重复提交
2.5 数据库添加唯一索引约束
数据库唯一性限制重复提交
三、分布式下后端拦截
3.1 锁
其实是锁加缓存
3.2 数据库添加唯一索引约束
数据库唯一性限制重复提交