开发中遇到的问题&解决方案(十)

464 阅读2分钟

「这是我参与2022首次更文挑战的第22天,活动详情查看:2022首次更文挑战

前言

我们在开发中一般遇到会对于敏感词的过滤或者屏蔽,因为之前做过社区类的APP,在这方面也踩了不少的坑,算是也积累了一点点的经验,那么今天我们来看看hutool里对于敏感词的一些操作,工具类SensitiveUtil()

一.怎么用

  1. 自定义敏感词,形成敏感树
  2. 初始化敏感树,有异步懒加载
  3. 寻找敏感树,核心密集匹配原则和贪婪匹配(最长匹配)
  4. 可以将敏感词列表的接口包装成接口,自由的添加和删除敏感词,像分词一样的操作 二.初始化敏感树
//sensitiveWords 敏感词列表,可以自定义 
//isAsync 是否异步化 类似于懒加载 可以选择的懒加载
public static void init(final Collection<String> sensitiveWords, boolean isAsync) {
   if (isAsync) {
      ThreadUtil.execAsync(() -> {
      // 初始化敏感树
         init(sensitiveWords);
         return true;
      });
   } else {
      init(sensitiveWords);
   }
}

三.寻找敏感树代码

 //检测文本
 //isDensityMatch 是否使用密集匹配原则
 //isGreedMatch   是否使用贪婪匹配(最长匹配)原则
public static List<FoundWord> getFoundAllSensitive(String text, boolean isDensityMatch, boolean isGreedMatch) {
 //这里跟正则表达式很类似
   return sensitiveTree.matchAllWords(text, -1, isDensityMatch, isGreedMatch);
}

四.敏感词过滤,被过滤的文本一般会被转成json,为什么转成json呢,这个问题相信很多小伙伴都知道,json处理起来很灵活,在很多第三方接口里json是最常用的

public static <T> T sensitiveFilter(T bean, boolean isGreedMatch, SensitiveProcessor sensitiveProcessor) {
   String jsonText = JSONUtil.toJsonStr(bean);
   @SuppressWarnings("unchecked")
   final Class<T> c = (Class<T>) bean.getClass();
   //递归查找 
   return JSONUtil.toBean(sensitiveFilter(jsonText, isGreedMatch, sensitiveProcessor), c);
}

五.最后再看看Spring里的过滤器运行原理,监听器全程像摄像头一样监听各种'动作',触发事件,一个正常的请求过来一般是先经过过滤器,Filter,至于要怎么过滤,可以自己定义,然后就是拦截器,一般拦截一些非法请求或者错误请求,简单的画了一个图

image.png

小结 过滤在系统里其实也很重要,一些敏感词必须过滤,不然对网站或者系统有一些影响,也算是一个小知识点吧。