13.Spring Boot防止表单重复提交实现方式

  • Post author:
  • Post category:其他




目录




1. Spring Boot基本介绍及Eclipse插件安装(STS)


2. Spring Boot基本使用(Thymeleaf模板、国际化)


3. Spring Boot使用Thymeleaf模板引擎


4. Thymeleaf标签详细


5. Spring Boot自动配置


6. Spring Boot配置文件(yml、properties)


7. Spring Boot集成常用配置参数


8. Spring Boot常用注解及JPA注解


9. Spring Boot事务


10. Spring Boot热部署


11. Spring Boot中使用JSP


12. Spirng Boot自定义错误页面


13. Spring Boot防止表单重复提交实现方式


14. Spring Boot监听器、过滤器、拦截器


15. Spring Boot单元测试(Service、Mock、Feign、Http Rest API)


16. Spring Boot多线程基本使用


17. Spring Boot加载指定YML文件





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为空则不通过。从而实现了防止表单重复提交



版权声明:本文为qq_45305209原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。