服务端防(恶意)并发提交方案
领取优惠券业务逻辑
count = getReceivedCount(userId,couponId);
if(count>=1) //假如每人限领一张
//提示已领取 直接返回
insertUserReceiveLog(userReceiveLog);
这种情况没法处理这些情况:
网络卡导致重复提交的情况
恶意调用接口
于是很有可能会插入多条记录 即同一用户领取了多张券
如何避免这种情况发生呢?
同步领取方法吗? 如
synchronized void receiveCoupon(...)
使用redis保存进入方法时间戳(如
set userId_1_receive_coupon_1 1460717130000
)
比较两个最近两次调用的时间戳 如果小于1秒 表示重复提交还是直接在
nginx
层或其他的地方如filter
统一处理重复提交的情况 如果判断为重复 直接返回
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
把这个事放客户端就容易多了,提交之后就把页面状态锁定,加个loading浮层,禁止用户继续操作。并且把客户端的请求超时时间设置的长点,基本上就能解决你的问题了。服务端也能减少各种验证什么的。
数据表加个字段表示状态,插入数据前先检查该状态值,符合要求才写入数据。