JAVA实现敏感词高亮或打码过滤:sensitive-word

练手项目中实现发表文章时检测文章是否带有敏感词,以及对所有敏感词的一键过滤功能

文章目录

效果预览

随便复制一篇内容到输入框

机器审核文章存在敏感词,弹消息提示并进入人工审核阶段(若机器审核通过,则无需审核直接发表)

审核浏览界面,把敏感词库关联到的所有敏感词高亮显示


再来看看一键打码功能,将文章中的敏感词替换成*

文章进行打码后就能直接发表通过了


实现步骤

有想过使用Elasticsearch实现,不过还要自己搞个敏感词库表感觉有点麻烦,体量较小的项目还是简单点实现吧,过段时间再研究采用Elasticsearch的方案。

所以此处我们引用sensitive-word敏感词工具组件上手

敏感词高亮功能

sensitive-word文档

首先Maven 引入依赖

xml 复制代码
<dependency>
    <groupId>com.github.houbb</groupId>
    <artifactId>sensitive-word</artifactId>
    <version>0.9.0</version>
</dependency>

在工具类文件夹中新建一个MyWordReplace.java来存放我们自定义的替换策略,用来实现敏感词高亮

java 复制代码
public class MyWordReplace implements IWordReplace {

    @Override
    public void replace(StringBuilder stringBuilder, final char[] rawChars, IWordResult wordResult, IWordContext wordContext) {
    	// 获取敏感词
        String sensitiveWord = InnerWordCharUtils.getString(rawChars, wordResult);
        // 自定义不同的敏感词替换策略,可以从数据库等地方读取
        if("我草".equals(sensitiveWord)) {
            stringBuilder.append("我测");
        } else if("傻X".equals(sensitiveWord)) {
            stringBuilder.append("睿智");
        } else {
            // 除了自定义敏感词替换策略,其余在富文本中转成红色高亮显示
            stringBuilder.append("<span style='color:red'>"+sensitiveWord+"</span>");
        }
    }
}

服务层中调用组件方法对传入参数进行敏感词校验和高亮替换

java 复制代码
		NoteContent content = note.getContent(); // 获取文本对象内容

		// 设一个布尔值作为返回值判断文章是否带敏感词
		boolean flag = false;
        if (note.getStatus()!= Note.STATE_NORMAL) {
            if (!SensitiveWordHelper.contains(content.getContent())) {
                note.setStatus(Note.STATE_RELEASE);
            }else{
            	// 替换高亮处理过滤后的文本
                content.setContent(SensitiveWordHelper.replace(content.getContent(), new MyWordReplace()));
                // 文章有敏感词,flag设为true
                flag = true;
            }
        }

一键打码功能

然后是非常简单的一键打码功能,前端设置一个一键打码的按钮,绑定点击方法如下

javascript 复制代码
// 把文章内容作为参数传给后端,后端处理完返回字符串到前端,替换掉原有文本
const putMosaic = function () {
  contentMosaic({ content: form.contentStr }).then(res => {
    form.contentStr = res.data
    ElMessage.success('一键打码成功')
  })
}

后端处理直接在控制层实现

java 复制代码
    @RequiresLogin
    @PutMapping("/contentMosaic")
    public R<String> contentMosaic(@RequestBody NoteContent noteContent) {
        String content = noteContent.getContent();
        if (!StringUtils.hasText(content)) {
            throw new ServiceException("内容为空");
        }
        // 直接返回打码替换后的内容
        return R.ok(SensitiveWordHelper.replace(content));
    }

完事~


10W的敏感词库还是有点过于敏感了,最好是根据项目要求自定义敏感词库,更多用法还是参考官方文档

相关推荐
好家伙VCC6 分钟前
**发散创新:探索群体智能编程中的新境界**随着科技的飞速发展,群体智能逐渐成为编程领域的一大研究热点。本文将深入探讨群体智能的概念、优
java·python·科技
秉承初心20 分钟前
Java 23种设计模式的详细解析
java·设计模式
千码君201625 分钟前
Go语言:记录一下Go语言系统学习的第一天
java·开发语言·学习·golang·gin·并发编程·编译语言
聪明的笨猪猪27 分钟前
Java 面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
MrSYJ1 小时前
学完涨工资的技巧2:Spring Authorization Server如何签发JWTToken
java·spring boot·微服务
珹洺1 小时前
Java-Spring入门指南(二十六)Android Studio下载与安装
java·spring·android studio
JAVA学习通1 小时前
JDK高版本特性总结与ZGC实践
java·jvm·算法
cxyxiaokui0011 小时前
JDK 动态代理 vs CGLIB:原理、区别与 Spring AOP 底层揭秘
java·后端·spring
代码充电宝1 小时前
LeetCode 算法题【中等】189. 轮转数组
java·算法·leetcode·职场和发展·数组
我命由我123451 小时前
PDFBox - PDDocument 与 byte 数组、PDF 加密
java·服务器·前端·后端·学习·java-ee·pdf