当前位置: 首页 > news >正文

敏感词过滤这么玩?自定义注解 + DFA 算法,优雅又高效!

文章目录

    • 一、为什么选 DFA 算法?
    • 二、设计思路:注解 + AOP + DFA
      • 目标效果示例:
    • 三、代码实现
      • 1. 自定义注解
      • 2. DFA 敏感词工具类
      • 3. AOP 拦截处理
      • 4. 使用示例
    • 四、整合与优化
    • 五、总结

博主介绍:全网粉丝10w+、CSDN合伙人、华为云特邀云享专家,阿里云专家博主、星级博主,51cto明日之星,热爱技术和分享、专注于Java技术领域
🍅文末获取源码联系🍅
👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟

在做评论系统、论坛、社交应用时,敏感词过滤几乎是一个绕不开的话题。
“敏感词”并不一定指违规词,也可能是你系统内部的一些黑名单词,比如屏蔽某些广告词,替换掉特定品牌词等。

很多同学第一次接触这个需求时,通常会写一个最简单的实现:

String text = "这里是广告,点我拿红包!";
text = text.replace("广告", "***");

但这种方式的问题显而易见:

  1. 只能匹配固定词,无法支持大规模敏感词库;
  2. 替换效率低,尤其是词库很大时;
  3. 不灵活,难以和业务层解耦。

今天我们就来聊聊一种优雅高效的方案自定义注解 + DFA 算法,让敏感词过滤既高效,又好维护,还能无侵入集成到 Spring 项目中。
在这里插入图片描述


一、为什么选 DFA 算法?

DFA(Deterministic Finite Automaton,确定有穷自动机)是一种高效的字符串匹配算法。相比于正则表达式和简单的 replace

  • 高效:DFA 能在 O(n) 时间复杂度内完成文本扫描,适合大规模词库。
  • 支持模糊匹配:不仅能精确匹配,还能检测出包含敏感词的长句。
  • 可扩展:敏感词可以随时更新,不需要改代码。

常见实现是将敏感词构建成一棵前缀树(Trie 树),文本只需扫描一遍,就能快速判定是否包含敏感词。


二、设计思路:注解 + AOP + DFA

我们想要的效果是:

  1. 在需要过滤的字段/参数上,加一个注解 @SensitiveFilter
  2. Spring AOP 自动拦截方法,在进入业务逻辑前替换掉敏感词;
  3. 业务层无需关心,过滤逻辑完全解耦。

目标效果示例:

@PostMapping("/comment")
public String addComment(@SensitiveFilter String content) {// content 已经是过滤后的文本return "保存成功:" + content;
}

如果用户输入 "这里是广告,点我拿红包!"
那么最终存入数据库的就是 "这里是**,点我拿红包!"


三、代码实现

我们分 4 步来实现:

1. 自定义注解

@Target({ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface SensitiveFilter {// 替换字符,默认是 "*"String replaceChar() default "*";
}

2. DFA 敏感词工具类

这里用 Trie 树实现 DFA。

public class SensitiveWordUtil {private static final Map<Character, Map> sensitiveWordMap = new HashMap<>();// 初始化词库public static void init(List<String> words) {for (String word : words) {Map<Character, Map> nowMap = sensitiveWordMap;for (int i = 0; i < word.length(); i++) {char c = word.charAt(i);Map<Character, Map> nextMap = (Map<Character, Map>) nowMap.get(c);if (nextMap == null) {nextMap = new HashMap<>();nowMap.put(c, nextMap);}nowMap = nextMap;}// 词尾标记nowMap.put(' ', new HashMap<>());}}// 过滤文本public static String filter(String text, String replaceChar) {StringBuilder result = new StringBuilder();int i = 0;while (i < text.length()) {int matchLen = checkSensitive(text, i);if (matchLen > 0) {// 替换为指定字符for (int j = 0; j < matchLen; j++) {result.append(replaceChar);}i += matchLen;} else {result.append(text.charAt(i));i++;}}return result.toString();}// 检查从某个位置开始是否包含敏感词private static int checkSensitive(String text, int start) {Map<Character, Map> nowMap = sensitiveWordMap;int length = 0;for (int i = start; i < text.length(); i++) {char c = text.charAt(i);nowMap = (Map<Character, Map>) nowMap.get(c);if (nowMap == null) {return 0;}length++;if (nowMap.containsKey(' ')) {return length;}}return 0;}
}

初始化的时候,可以从数据库或配置文件里加载敏感词库,例如:

SensitiveWordUtil.init(Arrays.asList("广告", "红包", "涉黄", "违法"));

3. AOP 拦截处理

@Aspect
@Component
public class SensitiveFilterAspect {@Around("@annotation(org.springframework.web.bind.annotation.PostMapping) || " +"@annotation(org.springframework.web.bind.annotation.RequestMapping)")public Object doFilter(ProceedingJoinPoint joinPoint) throws Throwable {Object[] args = joinPoint.getArgs();Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();Parameter[] parameters = method.getParameters();for (int i = 0; i < parameters.length; i++) {if (parameters[i].isAnnotationPresent(SensitiveFilter.class) && args[i] instanceof String) {SensitiveFilter annotation = parameters[i].getAnnotation(SensitiveFilter.class);args[i] = SensitiveWordUtil.filter((String) args[i], annotation.replaceChar());}}return joinPoint.proceed(args);}
}

这样,当 Controller 层的接口收到字符串参数时,就会自动替换掉敏感词。


4. 使用示例

@RestController
public class CommentController {@PostMapping("/comment")public String addComment(@SensitiveFilter String content) {return "保存成功:" + content;}
}

输入:

POST /comment
body: 这里是广告,点我拿红包!

输出:

保存成功:这里是**,点我拿**

四、整合与优化

  1. 敏感词库动态加载

    • 可以存到数据库,结合 Redis 做缓存。
    • 后台增加“敏感词管理”功能,实时更新。
  2. 替换规则多样化

    • 不仅仅是 "***",也可以替换成 [违规词]
    • 注解里增加参数:mode = REPLACE / BLOCK,选择直接拒绝还是替换。
  3. 多层级拦截

    • 不仅仅是 @Controller 参数,还能应用到 DTO 的字段上。
    • 使用反射递归处理对象中的 @SensitiveFilter 字段。

五、总结

本文我们实现了一个自定义注解 + DFA 算法的敏感词过滤方案:

  • 用 DFA 提升匹配效率,支持大规模词库;
  • 用注解 + AOP 解耦业务逻辑,使用简单;
  • 方案灵活,可动态扩展敏感词库和替换策略。

这套方案不仅适合小项目,也能支撑中大型系统,尤其是评论区、弹幕、聊天消息等场景,能大大减少违规风险。

未来你还可以继续扩展:

  • 敏感词分类(政治、广告、低俗),按业务场景应用;
  • 多语言敏感词库(中文 + 英文混合);
  • 结合机器学习做“上下文敏感”过滤。

一句话总结:优雅又高效的敏感词过滤,不是写个 replace,而是让框架帮你做。 🚀

大家点赞、收藏、关注、评论啦 、查看👇🏻获取联系方式👇🏻


文章转载自:

http://AFQpGOax.twgzq.cn
http://iER7U1WC.twgzq.cn
http://t12QG7JT.twgzq.cn
http://JvUXCrgJ.twgzq.cn
http://gK5Exogl.twgzq.cn
http://7c8AWgeC.twgzq.cn
http://2rnnZHme.twgzq.cn
http://ABA3VA79.twgzq.cn
http://AyiHkktz.twgzq.cn
http://XC1uKEE1.twgzq.cn
http://4sEphN5a.twgzq.cn
http://UfqExEj6.twgzq.cn
http://GKsWV3rK.twgzq.cn
http://trM20Sxz.twgzq.cn
http://stvFlh5a.twgzq.cn
http://F8M5Akcy.twgzq.cn
http://nVQRafxM.twgzq.cn
http://NXv0w2FI.twgzq.cn
http://KzsRTmHj.twgzq.cn
http://qp9lEfWv.twgzq.cn
http://VFJft5Ok.twgzq.cn
http://dyBnt02p.twgzq.cn
http://GH2a78Lv.twgzq.cn
http://f097DPTf.twgzq.cn
http://Yjpl9LMf.twgzq.cn
http://4mqwpzC1.twgzq.cn
http://aueR5bYT.twgzq.cn
http://pJ2RWL5i.twgzq.cn
http://Zx4ugh7d.twgzq.cn
http://XAxxgjCO.twgzq.cn
http://www.dtcms.com/a/368881.html

相关文章:

  • RPC内核细节(转载)
  • 如何将 Android 设备的系统底层日志(如内核日志、系统服务日志等)拷贝到 Windows 本地
  • Vue美化文字链接(超链接)
  • 中囯移动电视盒子(魔百和)B860AV2.1-A2和CM311-5-zg刷机手记
  • TCP/IP函数——sendmsg
  • Linux网络自定义协议与序列化
  • 人工智能机器学习——聚类
  • docker-compose跨节点部署Elasticsearch 9.X集群
  • Qt控件:Item Views/Widgets
  • 轻量高效:Miniserve文件共享神器
  • Netty从0到1系列之JDK零拷贝技术
  • 从无图到轻图,大模型时代,图商的新角逐
  • 【物种分布模型】R语言物种气候生态位动态量化与分布特征模拟——气候生态位动态检验、质心转移可视化、适生区预测等
  • 盟接之桥说制造:在安全、确定与及时之间,构建品质、交期与反应速度的动态平衡
  • 【Android】SQLite使用——增删查改
  • DJANGO后端服务启动报错及解决
  • Hive使用Tez引擎出现OOM的解决方法
  • 前端三件套+springboot后端连通尝试
  • AI大模型如何重塑日常?从智能办公到生活服务的5个核心改变
  • 158-EEMD-HHT算法
  • 人机信智协同新范式:信的双重性与序位统合
  • RT-Thread源码分析字节实现socket源码
  • 华锐视点VR风电场培训课件:多模块全面覆盖风机知识与操作​
  • Redis 主从复制:银行 “总公司与分公司” 的业务同步逻辑
  • Docker Compose 一键安装PLG日志系统方案详解
  • 运维安全02 - PAM介绍以及使用
  • 小补充: IPv6 安全RA
  • 企业培训笔记:宠物信息管理--实现宠物信息的删除
  • 燃气安全监测预警平台建设项目
  • 小场景大市场:猫狗识别算法在宠物智能设备中的应用