我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SpringBoot使用SensitiveWord实现敏感词过滤

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SpringBoot使用SensitiveWord实现敏感词过滤

包含默认敏感词过滤和自定义敏感词过滤。

导入依赖

<dependency>
  <groupId>com.github.houbb</groupId>
  <artifactId>sensitive-word</artifactId>
  <version>0.2.0</version>
</dependency>

Github地址

方法

方法参数返回值说明
contains(String)待验证的字符串布尔值验证字符串是否包含敏感词
replace(String, ISensitiveWordReplace)使用指定的替换策略替换敏感词字符串返回脱敏后的字符串
replace(String, char)使用指定的 char 替换敏感词字符串返回脱敏后的字符串
replace(String)使用 * 替换敏感词字符串返回脱敏后的字符串
findAll(String)待验证的字符串字符串列表返回字符串中所有敏感词
findFirst(String)待验证的字符串字符串返回字符串中第一个敏感词
findAll(String, IWordResultHandler)IWordResultHandler 结果处理类字符串列表返回字符串中所有敏感词
findFirst(String, IWordResultHandler)IWordResultHandler 结果处理类字符串返回字符串中第一个敏感词

ISensitiveWordReplace:敏感词替换策略。

IWordResultHandler:结果处理。可以对敏感词的结果进行处理,允许用户自定义。内置了WordResultHandlers 工具类。

  • WordResultHandlers.word():只保留敏感词单词本身。
  • WordResultHandlers.raw():保留敏感词相关信息,包含敏感词以及敏感词对应的开始和结束下标。

默认示例

使用默认提供的方法。

@Test
void testWord() {
  String text = "红旗迎风飘扬,主席的画像屹立在天安门前。";
  System.out.println(SensitiveWordHelper.contains(text));

  System.out.println(SensitiveWordHelper.replace(text));
  System.out.println(SensitiveWordHelper.replace(text, '0'));

  System.out.println(SensitiveWordHelper.findFirst(text));
  System.out.println(SensitiveWordHelper.findFirst(text, WordResultHandlers.word()));
  System.out.println(SensitiveWordHelper.findFirst(text, WordResultHandlers.raw()));

  System.out.println(SensitiveWordHelper.findAll(text));
  System.out.println(SensitiveWordHelper.findAll(text, WordResultHandlers.word()));
  System.out.println(SensitiveWordHelper.findAll(text, WordResultHandlers.raw()));

}

输出:

Init sensitive word map end! Cost time: 163ms
true
****迎风飘扬,***的画像屹立在***前。
0000迎风飘扬,000的画像屹立在000前。
红旗
红旗
WordResult{word='红旗', startIndex=0, endIndex=4}
[红旗, 主席, 天安门]
[红旗, 主席, 天安门]
[WordResult{word='红旗', startIndex=0, endIndex=4}, WordResult{word='主席', startIndex=9, endIndex=12}, WordResult{word='天安门', startIndex=18, endIndex=21}]

自定义替换策略示例

采用自定义的替换策略实现。首先需要实现 ISensitiveWordReplace接口自定义替换策略:

package com.tothefor;

import com.github.houbb.heaven.util.lang.CharUtil;
import com.github.houbb.sensitive.word.api.ISensitiveWordReplace;
import com.github.houbb.sensitive.word.api.ISensitiveWordReplaceContext;

public class MySensitiveWordReplace implements ISensitiveWordReplace {

  @Override
  public String replace(ISensitiveWordReplaceContext context) {
    String sensitiveWord = context.sensitiveWord();
    // 自定义不同的敏感词替换策略,可以从数据库等地方读取
    if ("红旗".equals(sensitiveWord)) {
      return "旗帜";
    }

    if ("天安门".equals(sensitiveWord)) {
      return "门";
    }

    if ("主席".equals(sensitiveWord)) {
      return "教员";
    }
    // 其他默认使用 * 代替
    int wordLength = context.wordLength();
    return CharUtil.repeat('*', wordLength);
  }

}

使用:

@Test
void testWord() {
  String text = "红旗迎风飘扬,主席的画像屹立在天安门前。";
  System.out.println(SensitiveWordHelper.contains(text));
  System.out.println(SensitiveWordHelper.replace(text, new MySensitiveWordReplace()));

  String text1 = "最好的记忆不如最淡的墨水。";
  System.out.println(SensitiveWordHelper.contains(text1));
  System.out.println(SensitiveWordHelper.replace(text1, new MySensitiveWordReplace()));

}

输出:

Init sensitive word map end! Cost time: 16ms
true
旗帜迎风飘扬,教员的画像屹立在门前。
false
最好的记忆不如最淡的墨水。

自定义

点进 SensitiveWordHelper 源码,可以看见以下代码:

private static final SensitiveWordBs WORD_BS = SensitiveWordBs.newInstance().init();

而且可以发现,方法也都是调用的 SensitiveWordBs 类的方法。所以,可以理解成 SensitiveWordHelper 只是对 SensitiveWordBs 的一层封装,而之所以封装就是为了提供给开发者针对简单场景的快速的使用。

而且从上面的创建语句中可以看见,没有加任何其他的东西,就只是初始化了一个,这也是最简单的。接下来就是自定义 SensitiveWordBs 实现敏感词过滤。

自定义SensitiveWordBs

下来看有哪些参数可以加,各项配置的说明如下:

序号方法说明
1ignoreCase忽略大小写
2ignoreWidth忽略半角圆角
3ignoreNumStyle忽略数字的写法
4ignoreChineseStyle忽略中文的书写格式
5ignoreEnglishStyle忽略英文的书写格式
6ignoreRepeat忽略重复词
7enableNumCheck是否启用数字检测。默认连续 8 位数字认为是敏感词
8enableEmailCheck是有启用邮箱检测
9enableUrlCheck是否启用链接检测

然后创建自定义的 SensitiveWordBs,如下:

package com.tothefor.motorcode.core.SensitiveWord;

import com.github.houbb.sensitive.word.bs.SensitiveWordBs;
import com.github.houbb.sensitive.word.support.allow.WordAllows;
import com.github.houbb.sensitive.word.support.deny.WordDenys;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SensitiveWordConfig {

  @Autowired
  private CustomWordAllow customWordAllow;

  @Autowired
  private CustomWordDeny customWordDeny;

  
  @Bean
  public SensitiveWordBs sensitiveWordBs() {
    // 可根据数据库数据判断 动态增加配置
    return SensitiveWordBs.newInstance()
      .wordDeny(WordDenys.chains(WordDenys.system(),customWordDeny)) // 设置黑名单
      .wordAllow(WordAllows.chains(WordAllows.system(), customWordAllow)) // 设置白名单
      .ignoreCase(true)
      .ignoreWidth(true)
      .ignoreNumStyle(true)
      .ignoreChineseStyle(true)
      .ignoreEnglishStyle(true)
      .ignoreRepeat(true)
      .enableEmailCheck(true)
      .enableUrlCheck(true)
      // 各种其他配置
      .init();
  }

}

其中,wordDeny、wordAllow是自定义敏感词的黑名单和白名单。可以设置单个,也可以设置多个。如下:

// 设置系统默认敏感词
SensitiveWordBs wordBs = SensitiveWordBs.newInstance()
     .wordDeny(WordDenys.system()) // 黑名单
     .wordAllow(WordAllows.system()) // 白名单
     .init();

// 设置自定义敏感词
SensitiveWordBs wordBs = SensitiveWordBs.newInstance()
     .wordDeny(new MyWordDeny())
     .wordAllow(new MyWordAllow())
     .init();

// 设置多个敏感词,系统默认和自定义
IWordDeny wordDeny = WordDenys.chains(WordDenys.system(), new MyWordDeny());
IWordAllow wordAllow = WordAllows.chains(WordAllows.system(), new MyWordAllow());
SensitiveWordBs wordBs = SensitiveWordBs.newInstance()
     .wordDeny(wordDeny)
     .wordAllow(wordAllow)
     .init();

接下来再加自定义敏感词配置。

自定义敏感词白名单

自定义有哪一些是敏感词白名单,如果遇见是需要进行展示的。通过实现 IWordAllow 接口重写 allow() 方法返回白名单敏感词。

package com.tothefor.motorcode.core.SensitiveWord;

import com.github.houbb.sensitive.word.api.IWordAllow;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.List;

@Service
public class CustomWordAllow implements IWordAllow {

  
  @Override
  public List<String> allow() {
    // 从数据库中查询白名单敏感词
    return Arrays.asList("红旗");
  }

}

自定义敏感词黑名单

增加敏感词黑名单。通过实现 IWordDeny 接口重写 deny() 方法返回黑名单敏感词。

package com.tothefor.motorcode.core.SensitiveWord;

import com.github.houbb.sensitive.word.api.IWordDeny;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.List;


@Service
public class CustomWordDeny implements IWordDeny {

  
  @Override
  public List<String> deny() {
    // 从数据库中查询自定义敏感词
    return Arrays.asList("红旗");
  }

}

示例

测试自定义使用:

@Autowired
private SensitiveWordBs sensitiveWordBs;

@Test
void testWord() {
  String text = "红旗迎风飘扬,主席的画像屹立在天安门前。";
  System.out.println(sensitiveWordBs.contains(text));

  System.out.println(sensitiveWordBs.replace(text));
  System.out.println(sensitiveWordBs.replace(text, '0'));
  System.out.println(sensitiveWordBs.replace(text, new MySensitiveWordReplace()));

  System.out.println(sensitiveWordBs.findFirst(text));
  System.out.println(sensitiveWordBs.findFirst(text, WordResultHandlers.word()));
  System.out.println(sensitiveWordBs.findFirst(text, WordResultHandlers.raw()));

  System.out.println(sensitiveWordBs.findAll(text));
  System.out.println(sensitiveWordBs.findAll(text, WordResultHandlers.word()));
  System.out.println(sensitiveWordBs.findAll(text, WordResultHandlers.raw()));

}

输出:

true
红旗迎风飘扬,***的画像屹立在***前。 
红旗迎风飘扬,000的画像屹立在000前。
红旗迎风飘扬,教员的画像屹立在门前。 
主席
主席
WordResult{word='主席', startIndex=9, endIndex=12}
[主席, 天安门]
[主席, 天安门]
[WordResult{word='主席', startIndex=9, endIndex=12}, WordResult{word='天安门', startIndex=18, endIndex=21}]

可以看见,和之前的有一点不一样。‘红旗’ 并没有被过滤掉,主要原因就是因为我们的自定义敏感词白名单中加入了 ‘红旗’ ,所以没有被过滤掉。但是黑名单中又有这个词,为什么没有被过滤掉?这里有个点就是:如果黑名单和白名单中都有同一个敏感词,那么这个词是不会被过滤的。

重置词库

因为敏感词库的初始化较为耗时,建议程序启动时做一次 init 初始化。但为了保证敏感词修改可以实时生效且保证接口的尽可能简化,可以在数据库词库发生变更时,需要词库生效,主动触发一次初始化 sensitiveWordBs.init()。因为在调用 sensitiveWordBs.init() 的时候,根据 IWordDeny+IWordAllow 重新构建敏感词库。因为初始化可能耗时较长(秒级别),所有优化为 init 未完成时不影响旧的词库功能,完成后以新的为准。

@Autowired
private SensitiveWordBs sensitiveWordBs;
sensitiveWordBs.init(); 

每次数据库的信息发生变化之后,首先调用更新数据库敏感词库的方法,然后调用这个方法。但不推荐将此方法放在数据库被修改后就调用,而推荐单独开一个接口,手动调用。

总结

所有的操作均是在 SensitiveWordBs 上操作的。

以上就是SpringBoot使用SensitiveWord实现敏感词过滤的详细内容,更多关于SpringBoot SensitiveWord敏感词过滤的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

SpringBoot使用SensitiveWord实现敏感词过滤

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

SpringBoot使用SensitiveWord实现敏感词过滤

这篇文章主要为大家详细介绍了SpringBoot如何使用SensitiveWord实现敏感词过滤功能,文中示例代码讲解详细,感兴趣的小伙伴可以了解一下
2023-01-14

python实现过滤敏感词

简述:关于敏感词过滤可以看成是一种文本反垃圾算法,例如 题目:敏感词文本文件 filtered_words.txt,当用户输入敏感词语,则用 星号 * 替换,例如当用户输入「北京是个好城市」,则变成「**是个好城市」 代码:#codin
2022-06-02

SpringBoot实现过滤敏感词的示例代码

这篇文章主要为大家详细介绍了如何利用SpringBoot实现过滤敏感词功能,文中的示例代码讲解详细,感兴趣的小伙伴可以动手尝试一下
2022-11-13

golang敏感词过滤的实现

本文主要介绍了golang敏感词过滤的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-01-03

C# 敏感词过滤算法实现

DFA即Deterministic Finite Automaton,也就是确定有穷自动机,它是是通过event和当前的state得到下一个state,即event+state=nextstate。在实现敏感词过滤的算法中,我们必须要减少运
C#过滤算法2024-12-02

Java怎么使用DFA算法实现敏感词过滤

本篇内容主要讲解“Java怎么使用DFA算法实现敏感词过滤”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java怎么使用DFA算法实现敏感词过滤”吧!1 前言敏感词过滤就是你在项目中输入某些字(
2023-07-05

SpringBoot使用前缀树过滤敏感词的方法是什么

这篇文章跟大家分析一下“SpringBoot使用前缀树过滤敏感词的方法是什么”。内容详细易懂,对“SpringBoot使用前缀树过滤敏感词的方法是什么”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。下面跟着
2023-06-26

JAVA使用前缀树(Tire树)实现敏感词过滤、词典搜索

本文主要介绍了JAVA使用前缀树(Tire树)实现敏感词过滤、词典搜索,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-01-03

Java使用DFA算法实现敏感词过滤的示例代码

很多项目中都会有一个敏感词管理模块,本文主要介绍了Java使用DFA算法实现敏感词过滤的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-03-24

如何在java中使用DFA算法过滤敏感词

如何在java中使用DFA算法过滤敏感词?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。敏感词过滤的做法有很多,我简单描述我现在理解的几种:①查询数据库当中的敏感词,循环每一
2023-05-31

怎么在Java中使用DFA算法过滤敏感词

怎么在Java中使用DFA算法过滤敏感词?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。具体实现: 1、匹配大小写过滤 2、匹配全角半角过滤 3、匹配过滤停顿词过滤。 4、敏
2023-05-30

Python基于DFA算法怎么实现内容敏感词过滤

这篇文章主要讲解了“Python基于DFA算法怎么实现内容敏感词过滤”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python基于DFA算法怎么实现内容敏感词过滤”吧!DFA 算法是通过提前
2023-06-30

Spring Boot如何实现敏感词及特殊字符过滤处理

这篇文章主要介绍“Spring Boot如何实现敏感词及特殊字符过滤处理”,在日常操作中,相信很多人在Spring Boot如何实现敏感词及特殊字符过滤处理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Spr
2023-06-20

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录