记录背景:SpringBoot项目实现敏感词汇过滤

一:敏感词汇文件放置位置


二:说明:如果txt文件不能编译,pom文件添加下面配置

  <build><resources><resource><directory>src/main/resources</directory><includes><include>**/*.*</include></includes></resource></resources></build>

三:简单的内存缓存敏感词汇类

public class Cache {/*** 键值对集合*/private final static ConcurrentHashMap<String, List<String>> MAP = new ConcurrentHashMap<>();/*** 添加缓存  */public synchronized static void put(String key, List<String> data) {//清除原键值对Cache.remove(key);//不设置过期时间MAP.put(key, data);}/*** 读取缓存    */public static List<String> get(String key) {return MAP.get(key);}/*** 清除缓存*/public synchronized static void remove(String key) {MAP.remove(key);}
}

四:敏感词汇过滤替换为*

package cloud.exec.common.wordfilterutils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.*;
/*** 敏感词汇过滤替换为** 说明:部分代码来源于互联网*/
@Slf4j
public class WordFilter {private final static String WORDS = "WORDS";private final static String REPLACE_CHAR = "*";private static HashMap sensitiveWordMap;/**     * 最小匹配规则     */private static int minMatchTYpe = 1;/**     * 最大匹配规则     */private static int maxMatchType = 2;/*** 敏感词汇过滤替换为*     ** @param text 待检测文字* @return 替换后文字*/public static String replaceWords(String text) {if (StringUtils.isBlank(text)) {return text;}//缓存获取敏感词汇原记录List<String> words = Cache.get(WORDS);if (CollectionUtils.isEmpty(words)) {//读取敏感词汇文件,存入缓存words = readWordsFile();Cache.put(WORDS, words);}if (CollectionUtils.isEmpty(words)) {return text;}//屏蔽敏感词汇return WordFilter.replaceSensitiveWord(words, text, WordFilter.minMatchTYpe);}/*** 读取敏感词汇文件*/private static List<String> readWordsFile() {List<String> list = new ArrayList<>();InputStream inputStream = null;InputStreamReader inputStreamReader = null;BufferedReader bufferedReader = null;try {Resource resource = new DefaultResourceLoader().getResource("classpath:words.txt");inputStream = resource.getInputStream();inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);bufferedReader = new BufferedReader(inputStreamReader);String txt = "";while (StringUtils.isNotBlank(txt = bufferedReader.readLine())) {list.addAll(Arrays.asList(StringUtils.split(StringUtils.deleteWhitespace(StringUtils.replace(txt, ",", ",")),",")));}bufferedReader.close();inputStreamReader.close();inputStream.close();} catch (Exception e) {log.error("读取敏感词汇文件出错", e);} finally {try {if (bufferedReader != null) {bufferedReader.close();}if (inputStreamReader != null) {inputStreamReader.close();}if (inputStream != null) {inputStream.close();}} catch (Exception e) {log.error("读取敏感词汇文件出错", e);}}return list;}/*** 替换敏感字字符** @param data      敏感字集合* @param txt       待检查文本* @param matchType 匹配规则*/private static String replaceSensitiveWord(List<String> data, String txt, int matchType) {if (sensitiveWordMap == null) {addSensitiveWord(data);}String resultTxt = txt;//获取所有的敏感词List<String> set = getSensitiveWord(txt, matchType);Iterator<String> iterator = set.iterator();while (iterator.hasNext()) {resultTxt = resultTxt.replaceAll(iterator.next(), REPLACE_CHAR);}return resultTxt;}/*** 读取敏感词库,将敏感词放入HashSet中,构建一个DFA算法模型:* 说明:该方法来源于互联网*/private static void addSensitiveWord(List<String> datas) {sensitiveWordMap = new HashMap(datas.size());Iterator<String> iterator = datas.iterator();Map<String, Object> now = null;Map now2 = null;while (iterator.hasNext()) {now2 = sensitiveWordMap;String word = iterator.next().trim(); //敏感词for (int i = 0; i < word.length(); i++) {char key_word = word.charAt(i);Object obj = now2.get(key_word);if (obj != null) { //存在now2 = (Map) obj;} else { //不存在now = new HashMap<String, Object>();now.put("isEnd", "0");now2.put(key_word, now);now2 = now;}if (i == word.length() - 1) {now2.put("isEnd", "1");}}}}/*** 获取内容中的敏感词*说明:该方法来源于互联网* @param text      内容* @param matchType 匹配规则 1=不最佳匹配,2=最佳匹配* @return*/private static List<String> getSensitiveWord(String text, int matchType) {List<String> words = new ArrayList<String>();Map now = sensitiveWordMap;int count = 0; //初始化敏感词长度int start = 0; //标志敏感词开始的下标for (int i = 0; i < text.length(); i++) {char key = text.charAt(i);now = (Map) now.get(key);if (now != null) { //存在count++;if (count == 1) {start = i;}if ("1".equals(now.get("isEnd"))) { //敏感词结束now = sensitiveWordMap; //重新获取敏感词库words.add(text.substring(start, start + count)); //取出敏感词,添加到集合count = 0; //初始化敏感词长度}} else { //不存在now = sensitiveWordMap;//重新获取敏感词库if (count == 1 && matchType == 1) { //不最佳匹配count = 0;} else if (count == 1 && matchType == 2) { //最佳匹配words.add(text.substring(start, start + count));count = 0;}}}return words;}public WordFilter() {super();}
}

五:测试

SpringBoot项目实现敏感词汇过滤相关推荐

  1. 【敏感词汇过滤算法】基于DFA-前缀树的敏感词汇过滤算法(项目实用)

    在敏感词汇过滤这块,不同的算法所造成的性能差异是非常大的,选择一个合适的算法非常重要.因为以前做算法的时候做过类似前缀树的字符串匹配之类的算法,所以一开始就打算用前缀树做的,后面了解了一下DFA的相关 ...

  2. Java基于Socket实现聊天、群聊、敏感词汇过滤功能

    首先的话,这个代码主要是我很久以前写的,然后当时还有很多地方没有理解,现在再来看看这份代码,实在是觉得丑陋不堪,想改,但是是真的改都不好改了- 所以,写代码,规范真的很重要. 实现的功能: 用户私聊 ...

  3. 优秀博客 --敏感词汇过滤

    2019独角兽企业重金招聘Python工程师标准>>> 敏感词汇过滤 http://www.cnblogs.com/chenssy/p/3751221.html#2966041 树上 ...

  4. 动态代理的分析以及利用动态代理模式进行敏感词汇过滤

    动态代理 增强对象的功能: 设计模式:一些通用的解决固定问题的方式 代理模式 概念: (1). 真实对象:被代理的对象 (2). 代理对象: (3). 代理模式:代理对象代理真实对象,达到增强真实对象 ...

  5. PHP敏感词汇过滤SDK(树形结构遍历命中违禁词)

    先介绍一下匹配敏感词原理吧,因为没有工具,画的很糙,有疑问直接联系我.(绿色箭头代表命中敏感词,灰色:未命中) base 确定有穷自动机(DFA)算法 比如说"可以"是敏感词,那么 ...

  6. 敏感词汇过滤(不区分大小写)

    最近项目中,用户评论内容需要屏蔽敏感词汇,从网上总结以下方法,(不区分大小写,如想设置大小写敏感,可以把代码中content..toLowerCase()去掉).具体看代码: 1.读取敏感词汇文档 & ...

  7. Filter - 通过拦截器与动态代理实现敏感词汇过滤

    需求:将敏感词汇.txt文件中的词语过滤为 -> "***" 分析: 首先加载文档,将文档中的词汇纳入集合中备用,方便后期比对使用. 使用Proxy动态代理将request对 ...

  8. C#敏感词汇过滤(不是正则)

    System.Text.StringBuilder sb = new System.Text.StringBuilder(text.Length);   string filterText = &qu ...

  9. JSP和敏感词汇过滤

    1.JSP 1.1 JSP概述 全称: Java Server Page      Java服务器页面,和Servlet一样,都是Sun公司提供的动态资源开发技术.兼容HTML,CSS,JavaScr ...

  10. 小程序敏感词汇过滤之输入什么都返OK

    1.post提交 2.post过去的数据编码为utf-8   注意:不仅仅是评论内容为utf-8,不然会导致你输入什么都返回ok $msg = json_encode(array('content'= ...

最新文章

  1. +[NSTimer scheduledTimerWithTimeInterval:repeats:block:]: unrecognized selector sent to xxx
  2. Eclipse: “Update SVN cache” hangs and locks up
  3. MySQL高级 - 查询缓存 - 配置参数
  4. xp中mysql优化_XP加速技巧大盘点 看看那个最实用
  5. java实现分布式redis锁_使用redis实现分布式锁
  6. 有限状态自动机java实现_用java开发编译器之:Thompson构造,将正则表达式转换为有限状态自动机...
  7. 《Python Cookbook 3rd》笔记(5.2):打印输出至文件中
  8. 动态图相册 android,‎动态图相册 in de App Store
  9. Angel深度学习在广告推荐训练优化中的实践.pdf(附下载链接)​
  10. Java中的守护程序线程
  11. 电子相框病毒,圣诞死灰复燃
  12. android mapping文件作用,Android打包代码混淆后的Mapping文件路径
  13. 2017 多校4 Dirt Ratio
  14. EOS Error 3090003: provided keys, permissions, and delays do not satisfy declared authoriz
  15. algodoo是什么意思_洋是什么意思 带洋字的男孩名字 用洋字起名的寓意
  16. iOS知识点汇总复习
  17. handlebars是什么
  18. 无人机倾斜影像建模哪个软件好
  19. Android 超简单音乐播放器(九)搜索网络歌曲,获得热门榜单(GridView)(易源api的使用)(JSON的解析)(刷新)
  20. Android自定义带标题边框的Layout

热门文章

  1. 【软件测试】美团一面、阿里一面复盘总结
  2. c语言十七算法,算法精解十七(C语言版)
  3. Github客户端下载慢的解决方法
  4. CAD绘图教程之CAD中怎么进行消防计算?
  5. 关于安装QCAT/QXDM异常的问题
  6. 解决《Python源码剖析》扫描版PDF字体模糊问题
  7. 安装黑群晖找不到局域网电脑_黑群晖洗白太复杂?我用蒲公英P5轻松实现
  8. 近世代数--陪集--拉格朗日定理|G|=|H|·[G:H],传递性[G:H][H:K]=[G:K]
  9. 流固耦合仿真案例及教学
  10. windows中如何显示/隐藏桌面图标