一个关于校验优惠券是否可以领取的问题

来源:9-15 用户领取优惠券

LBruce

2019-10-30

贴上老师的代码:

if (templateId2Coupons.containsKey(request.getTemplateSDK().getId())
                && templateId2Coupons.get(request.getTemplateSDK().getId()).size()
                >= request.getTemplateSDK().getRule().getLimitation()) {
            log.error("Exceed Template Assign Limitation:{}",
                    request.getTemplateSDK().getId());
            throw new CouponException("Exceed Template Assign Limitation");
        }

在判断limitation的时候,不应该拿request的limitation字段去做判断,因为request是请求参数,是有可能伪造的。比如说新建了一个优惠券模板1,limitation为1,即每个用户仅限领取1张。但是在领取优惠券的时候,request中的limitation却是100,那这样的话,就会出现用户能够领取不止1张模板1的优惠券这种错误情况。

templateId2Coupons.get(request.getTemplateSDK().getId()).size()
                >= request.getTemplateSDK().getRule().getLimitation()

应该改成如下图所示,因为idsTemplate是从数据库中查找出来的,limitation是可靠的。

templateId2Coupons.get(request.getTemplateSDK().getId()).size()
                >= id2Template.get(request.getTemplateSDK().getId()).getRule().getLimitation()
写回答

1回答

张勤一

2019-10-31

同学你好:

    你这里提出的问题是正确的。确实是不应该相信任何外部传递的参数直接去使用,这里也是我在课程中留下的一个问题,将来我会在课程更新的时候说明并解决。

    感谢同学的认真学习,思考的问题非常到位。


    欢迎来 QQ 群随时交流、讨论,也非常感谢同学的支持!

3
1
LBruce
非常感谢!
2019-10-31
共1条回复

Spring Cloud微服务实战 打造企业级优惠券系统

微服务,SpringCloud,SpringBoot面试、毕设、

1203 学习 · 487 问题

查看课程