过滤HTML标签导致死循环

错误严重度

故障A

错误案例

以下是资讯VCUtil.java类里面一个同事加的一个方法,而这个类又被在页面上广泛使用。

  //去掉单引号、双引号和红色htmltag
    public static String filterToHtml(String str){     
        int start = 0;
        int end   = 0;
        while(str.indexOf("<")>=0 && str.indexOf(">")>=0){
            start = str.indexOf("<");
            end   = str.indexOf(">");
            str   = str.replace(str.substring(start, end+1), "");
        }     
        return str.replaceAll("\'", "").replaceAll("\"", """).replaceAll("<font color=red>", "").replaceAll("</font>", "");
    }

这个方法有个严重的bug,就是特定条件下会导致死循环,也就是这个方法导致资讯当时出现了大面积load到20多。


错误分析

比如这样的一个标题:

     String title="<font color=red>我的资讯></font>"; 

运用这个方法之后做第一循环,<font color=red>被替换成空字符串"" 第二次循环,title就变成:"我的资讯></font>", 继续运行,这时:

   start=end+1;
   str.substring(start, end+1)也即str.substring(end+1, end+1)

这样子字符串就是"", 再做replace成"", 永远退不出循环。一旦被标红的标题多了'>', 就会导致死循环。这只是其中的一种,可能还有其它的情况,只要最后><连在一起,就出现死循环。我在我机器跑了4个,机器的CPU100%,已经走不动了

正确用法

我们的应用跑了这么多年,一般的工具类或方法我们都有的,一般不需要自己写。 当遇到这种情况时,先咨询下资深的开发人员或架构师,框架中有没有相应的类或方法,如果有直接拿来使用,毕竟是久经验证的,错误的几率下。万不得已非要自己写时,记得一定找架构师review下,因为工具类方法是暴露给很多人用的,自己写可能考虑不够全面,出错的几率比较大。


测试关注点

1.多走一些测试路径

2. 尝试错误数据进行测试验证。


Java8新特性及实战视频教程完整版Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。 Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。使用Lambda 表达式可以使代码变的更加简洁紧凑。Java8实战视频-01让方法参数具备行为能力Java8实战视频-02Lambda表达式初探Java8实战视频-03Lambda语法精讲Java8实战视频-04Lambda使用深入解析Java8实战视频-05Lambda方法推导详细解析-上.wmvJava8实战视频-06Lambda方法推导详细解析-下Java8实战视频-07Stream入门及Stream在JVM中的线程表现Java8实战视频-08Stream知识点总结Stream源码阅读Java8实战视频-09如何创建Stream上集Java8实战视频-10如何创建Stream下集.wmvJava8实战视频-11Stream之filter,distinct,skip,limit,map,flatmap详细介绍Java8实战视频-12Stream之Find,Match,Reduce详细介绍Java8实战视频-13NumericStream的详细介绍以及和Stream之间的相互转换Java8实战视频-14Stream综合练习,熟练掌握API的用法Java8实战视频-15在Optional出现之前经常遇到的空指针异常.wmvJava8实战视频-16Optional的介绍以及API的详解Java8实战视频-17Optional之flatMap,综合练习,Optional源码剖析Java8实战视频-18初识Collector体会Collector的强大Java8实战视频-19Collector使用方法深入详细介绍-01Java8实战视频-20Collector使用方法深入详细介绍-02Java8实战视频-21Collector使用方法深入详细介绍-03.wmvJava8实战视频-22Collector使用方法深入详细介绍-04Java8实战视频-23Collector原理讲解,JDK自带Collector源码深度剖析Java8实战视频-24自定义Collector,结合Stream的使用详细介绍Java8实战视频-25Parallel Stream编程体验,充分利用多核机器加快计算速度Java8实战视频-26Fork Join框架实例深入讲解Java8实战视频-27Spliterator接口源码剖析以及自定义Spliterator实现一个Stream.wmvJava8实战视频-28Default方法的介绍和简单的例子Java8实战视频-29Default方法解决多重继承冲突的三大原则详细介绍Java8实战视频-30多线程Future设计模式原理详细介绍,并且实现一个Future程序Java8实战视频-31JDK自带Future,Callable,ExecutorService介绍Java8实战视频-32实现一个异步基于事件回调的Future程序.wmvJava8实战视频-33CompletableFuture用法入门介绍Java8实战视频-34CompletableFuture之supplyAsync详细介绍Java8实战视频-35CompletableFuture流水线工作,join多个异步任务详细讲解Java8实战视频-36CompletableFuture常用API的重点详解-上Java8实战视频-37CompletableFuture常用API的重点详解-下Java8实战视频-38JDK老DateAPI存在的问题,新的DateAPI之LocalDate用法及其介绍.wmvJava8实战视频-39New Date API之LocalTime,LocalDateTime,Instant,Duration,Period详细介绍Java8实战视频-40New Date API之format和parse介绍
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值