前言
我们在开发中一般遇到会对于敏感词的过滤或者屏蔽,因为之前做过社区类的APP,在这方面也踩了不少的坑,算是也积累了一点点的经验,那么今天我们来看看hutool里对于敏感词的一些操作,工具类SensitiveUtil()
一.怎么用
- 自定义敏感词,形成敏感树
- 初始化敏感树,有异步懒加载
- 寻找敏感树,核心密集匹配原则和贪婪匹配(最长匹配)
- 可以将敏感词列表的接口包装成接口,自由的添加和删除敏感词,像分词一样的操作
二.初始化敏感树
//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,至于要怎么过滤,可以自己定义,然后就是拦截器,一般拦截一些非法请求或者错误请求,简单的画了一个图
小结 过滤在系统里其实也很重要,一些敏感词必须过滤,不然对网站或者系统有一些影响,也算是一个小知识点吧。