Java 后台防重复提交一般怎么做的?
我们现阶段就是加了一个张表,订单号唯一主键。请求过来的时候会校验数据库有没有这条单号数据,这个方法是非事务的。还有没有什么其他好的方法了。
我在想要不要放在 redis 里面。。求大佬指教啊
我们现阶段就是加了一个张表,订单号唯一主键。请求过来的时候会校验数据库有没有这条单号数据,这个方法是非事务的。还有没有什么其他好的方法了。
我在想要不要放在 redis 里面。。求大佬指教啊
后端:
差不多也是用锁的思路 无非就是锁的粒度,可以锁业务,也可以锁订单。看业务需求。
传统框架大部分自带 Form 重复提交了。
而且他说了是相同参数.
前端:做放重复点击,点击过后没返回结果,不能重复点击.
一般传统 Web 框架都是隐藏字段,比如 JSF, Jakarta MVC 等,这些框架都是会自己有较验机制,不用手动代码检测。
https://github.com/hantsy/jakartaee-mvc-sample/blob/master/src/main/webapp/WEB-INF/views/add.xhtml#L13-L15
https://github.com/hantsy/jakartaee-mvc-sample/blob/master/src/main/java/com/example/web/TaskController.java#L89
Spring Security 也支持 Csrf,可以用于表单验证(使用 Themleaf 等),或者 Http Header (用于 API )。Spring 官方教程与 Angular 结合的 Microservice 例子,https://spring.io/guides/tutorials/spring-security-and-angular-js/
我把所有非幂等操作 md5(body+token)用 redis 做了缓存,ttl 5 秒,重复值丢弃.建立在误点操作两次请求内容完全相同的前提下能正常工作.
如果是业务类型,比如 A 用做 xx 操作时,禁止 A 用户同时做 xx 操作。比如不允许同时发两个密码不同的改密码请求。类似这种,比如商家转账,此时考虑用分布式锁,用数据库、Redis 、ZooKeeper 、ETCD 看你喜好和资源了。
如果是类似安全类型的,比如重放攻击。可以通过对 Nonce 串进行 Hash 校验,对于重复的请求进行识别与过滤,及至屏蔽转移攻击。