美文网首页Java学习笔记
边界,边界,还是边界

边界,边界,还是边界

作者: Viking_Den | 来源:发表于2016-09-22 23:14 被阅读15次

某商家生产的电子产品非常畅销,需要提前30天预订才能抢到手,同时它还规定了一个会员可拥有的最多产品数量,目的是防止囤积压货肆意加价。会员的预定过程是这样的:先登录官方网站,选择产品型号,然后设置需要预订的数量,提交,符合规则即提示下单成功,不符合规则提示下单失败。后台的处理逻辑模拟如下:

public class Client {  
     //一个会员拥有产品的最多数量  
     public final static int LIMIT = 2000;  
     public static void main(String[] args) {  
          //会员当前拥有的产品数量  
          int cur = 1000;  
          Scanner input = new Scanner(System.in);  
          System.out.print("请输入需要预定的数量:");  
          while(input.hasNextInt()){  
            int order = input.nextInt();  
            //当前拥有的与准备订购的产品数量之和  
            if(order>0 && order+cur<=LIMIT){  
                System.out.println("你已经成功预定的"+order+"个产品!");  
            }else{  
                System.out.println("超过限额,预订失败!");  
            }  
        }  
    }  
} 

这是一个简易的订单处理程序,其中cur代表的是会员已经拥有的产品数量,LIMIT是一个会员最多拥有的产品数量(现实中这两个参数当然是从数据库中获得的,不过这里是一个模拟程序),如果当前预订数量与拥有数量之和超过了最大数量,则预订失败,否则下单成功。业务逻辑很简单,同时在Web界面上对订单数量做了严格的校验,比如不能是负值、不能超过最大数量等,但是人算不如天算,运行不到两小时数据库中就出现了异常数据:某会员拥有产品的数量与预订数量之和远远大于限额。怎么会这样?程序逻辑上不可能有问题呀,这是如何产生的呢?我们来模拟一下,第一次输入:

请输入需要预定的数量:800  
你已经成功预定的800个产品! 

这完全满足条件,没有任何问题,继续输入:

请输入需要预定的数量:2147483647  
你已经成功预定的2147483647个产品! 

看到没,这个数字远远超过了2000的限额,但是竟然预订成功了,真是神奇!

看着2147483647这个数字很眼熟?那就对了,它是int类型的最大值,没错,有人输入了一个最大值,使校验条件失效了,Why?我们来看程序,order的值是2147483647,那再加上1000就超出int的范围了,其结果是-2147482649,那当然是小于正数2000了!一句话可归结其原因:数字越界使检验条件失效。

在单元测试中,有一项测试叫做边界测试(也有叫做临界测试),如果一个方法接收的是int类型的参数,那以下三个值是必测的:0、正最大、负最小,其中正最大和负最小是边界值,如果这三个值都没有问题,方法才是比较安全可靠的。我们的例子就是因为缺少边界测试,致使生产系统产生了严重的偏差。

也许你要疑惑了,Web界面既然已经做了严格的校验,为什么还能输入2147483647这么大的数字呢?是否说明Web校验不严格?错了,不是这样的,Web校验都是在页面上通过JavaScript实现的,只能限制普通用户(这里的普通用户是指不懂HTML、不懂HTTP、不懂Java的简单使用者),而对于高手,这些校验基本上就是摆设,HTTP是明文传输的,将其拦截几次,分析一下数据结构,然后再写一个模拟器,一切前端校验就都成了浮云!想往后台提交个什么数据那还不是信手拈来?!

相关文章

  • 边界,边界,还是边界

    某商家生产的电子产品非常畅销,需要提前30天预订才能抢到手,同时它还规定了一个会员可拥有的最多产品数量,目的是防止...

  • 边界思维

    ?不管是谁?想要成事就一定要遵守边界思维。 ❤️认知边界,能力边界,关系边界,趋势边界。 1、认知边界:知道什么能...

  • 认知边界距离(电商峰会有感)

    穷其一生,人总是在不断的探索各种边界。不管是生活的边界,还是心理边界,更或者是认知的边界。 永保谦虚,终身学习,是...

  • 2021-10-13 心有边界 方知分寸

    今天和朋友发生的一件事儿,让我回到了理性思维思考边界意识。 边界包含自我边界,他人边界,社会规则边界...

  • 人和人之间的边界

    今天我想谈谈“边界”这个概念。 不是谈认知的边界,不是谈能力的边界,而是,人和人之间的边界。 这里边界的意思是:我...

  • 170722-《女性智慧》后记

    为人处事,先学会认清“边界”。 你和爱人的边界 你和孩子的边界 你和父母的边界 你和婆婆的边界——把婆婆当领导,划...

  • 正则表达式

    边界 单词边界与非单词边界单词: [a-zA-Z0-9_]这就是单词 边界就是位置 单词边界一侧是单词一侧非单词字...

  • 睡不着

    思路: 1.得到连通区域边界坐标,和mask区域边界坐标 2.判断边界坐标距离(for),if存在边界距离小于等于...

  • 边界意识

    4.边界意识 4.1地理边界 4.1.1家庭内部的地理边界 彼此之间有清晰的地理边界的,大家会尊重这个边界,虽然看...

  • 边界不清,是混乱的原因

    任何事情都有边界,往往边界不清晰就会造成混乱。比如工作和生活的边界,友情和爱情的边界,美好与丑恶的边界等等。 有这...

网友评论

    本文标题:边界,边界,还是边界

    本文链接:https://www.haomeiwen.com/subject/crftyttx.html