目录
1. Spring Boot基本介绍及Eclipse插件安装(STS)
2. Spring Boot基本使用(Thymeleaf模板、国际化)
6. Spring Boot配置文件(yml、properties)
15. Spring Boot单元测试(Service、Mock、Feign、Http Rest API)
Spring Boot防止表单重复提交实现方式
Spring Boot防止表单重复提交实现方式
表单重复提交存在的情况
(1)点击提交按钮两次
(2)点击刷新按钮
(3)使用浏览器后退按钮重复之前的操作,导致重复提交表单
(4)使用浏览器历史记录重复提交表单
(5)浏览器重复的HTTP请求
用户提交表单时可能因为网速的原因,或者网页被恶意刷新,致使同一条记录重复插入到数据库中,这是一个比较棘手的问题。我们可以从客户端和服务器端一起着手,设法避免同一表单的重复提交。
1.通过JavaScript屏蔽提交按钮(不推荐)
当表单提交后使用Javascript使提交按钮无法点击或点击无效(disable),从而实现防止表单重复提交。
注意:这种方法防止心急的用户多次点击按钮。但有个问题,js代码很容易被绕过
(1)如果客户端把Javascript给禁止掉,这种方法就无效了
(2)用户通过刷新页面方式,或使用postman等工具绕过前段页面仍能重复提交表单。因此不推荐此方法
2.使用Post/Redirect/Get模式
在提交后执行页面重定向,这就是所谓的Post-Redirect-Get (PRG)模式
简言之,当用户提交了表单后,去执行一个客户端的重定向,转到提交成功信息页面。
这能避免用户按F5导致的重复提交,而其也不会出现浏览器表单重复提交的警告,也能消除按浏览器前进和后退按导致的同样问题
3.数据库增加唯一键约束(简单粗暴)
在数据库建表的时候在ID字段添加主键约束,用户名、邮箱、电话等字段加唯一性约束。确保数据库只可以添加一条数据。
数据库加唯一性约束sql:
alter table tableName_xxx add unique key uniq_xxx(field1, field2)
服务器及时捕捉插入数据异常:
try {
xxxMapper.insert(user);
} catch (DuplicateKeyException e) {
logger.error("user already exist");
}
通过数据库加唯一键约束能有效避免数据库重复插入相同数据。但无法阻止恶意用户重复提交表单(攻击网站),服务器大量执行sql插入语句,增加服务器和数据库负荷
4.使用Cookie处理
使用Cookie记录表单提交的状态,根据其状态可以检查是否已经提交表单
注意
:如果客户端禁止了Cookie,该方法将不起任何作用
5.利用Session防止表单重复提交(推荐)
实现原理:服务器返回表单页面时,会先生成一个subToken保存于session,并把该subToen传给表单页面。当表单提交时会带上subToken,服务器拦截器Interceptor会拦截该请求,拦截器判断session保存的subToken和表单提交subToken是否一致。若不一致或session的subToken为空或表单未携带subToken则不通过。
首次提交表单时session的subToken与表单携带的subToken一致走正常流程,然后拦截器内会删除session保存的subToken。当再次提交表单时由于session的subToken为空则不通过。从而实现了防止表单重复提交