Java 后台防重复提交一般怎么做的?

2020-06-11 11:33:55 +08:00
 luxinfl

我们现阶段就是加了一个张表,订单号唯一主键。请求过来的时候会校验数据库有没有这条单号数据,这个方法是非事务的。还有没有什么其他好的方法了。

我在想要不要放在 redis 里面。。求大佬指教啊

12319 次点击
所在节点    Java
74 条回复
Wuxj
2020-06-12 09:57:31 +08:00
跳转到下单页的时候,将一些唯一性参数先传到后端生成唯一性 requestId,通过后端跳转到下单页,将生成的 requestId 放隐藏字段。提交订单的时候,根据 requestId 生成分布式锁。刚毕业那会做的,好像也没啥问题~仅供参考
TomatoYuyuko
2020-06-12 10:52:41 +08:00
扔前端做啊,哪有前端不做设置的
sola97
2020-06-12 11:23:19 +08:00
虽然我不懂,但前端处理防不了各种爬虫、脚本、秒杀软件吧
zhupeng163
2020-06-12 11:44:29 +08:00
定义一个环绕增强的切面,切需要防重提交的 controller 甚至所有 controller,类名+方法名+所有参数拼接起来作为 key,用 redis setNx,给一个失效时间,setNx 返回 false 则抛重复提交异常。
1107139144
2020-06-12 11:51:13 +08:00
请求加锁
wanguorui123
2020-06-12 12:56:27 +08:00
用户锁+业务判断
pythonee
2020-06-12 14:44:28 +08:00
csrf+1
不过数据库的设计也有必要
pythonee
2020-06-12 14:44:57 +08:00
@guoyuchuan 尽量避免百度哦
guoyuchuan
2020-06-12 14:53:25 +08:00
@pythonee #68
那就谷歌
ningyu1
2020-06-12 14:56:48 +08:00
csrf+1
ningyu1
2020-06-12 15:07:32 +08:00
csrf 能控制一部分重复提交(同一个页面多次点击 button 提交), 另外一部分是相同的业务参数重复提交(刷新页面获取新的 csrftoken 但是提交请求的其他参数不变,多用在录制回放),这个还要配合后端的幂等控制,做法有很多,可以排序后 md5 放到 redis 中去验证是否存在,也可以使用临时表控制幂等。
BlackBerry999
2020-06-12 16:37:16 +08:00
前端做防抖节流
wc951
2020-06-13 16:25:33 +08:00
前端是为了用户体验,后端是为了业务安全,都要做防重放的
reeco
2020-06-14 21:43:42 +08:00
分布式悲观锁

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/680607

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX