sensitive word工具是一个快速的敏感词过滤工具,基于 DFA 算法实现的高性能敏感词工具。
1.DFA算法是相比于其他算发性能更高,所读更改快
2.其中包含默认的敏感词共6W
3.支持自定替换,支持手动扩展敏感词词库,也可以放行敏感词,方形掉相对于使用方不敏感的词语
3.支持运行时加载敏感词词库,无需进行重新部署
com.github.houbb
sensitive-word
0.2.0
方法 | 参数 | 返回值 | 说明 |
---|---|---|---|
contains(String) | 待验证的字符串 | boolean | false为不存在敏感词,true为存在敏感词 |
findAll(String) | 待验证的字符串 | List | 返回值为待验证字符串中敏感词集合 |
replace(String) | 待验证的字符串 | String | 将敏感词使用*替换之后的字符 |
final String text = "五星红旗迎风飘扬,画像屹立在天安门前。";
boolean isFalse = SensitiveWordHelper.contains(text);
final String text = "五星红旗迎风飘扬,画像屹立在天安门前。";
List<String> wordList = SensitiveWordHelper.findAll(text);
final String text = "五星红旗迎风飘扬,画像屹立在天安门前。";
String result = SensitiveWordHelper.replace(text);
final String text = "五星红旗迎风飘扬,毛主席的画像屹立在天安门前。";
//指定替换词类
ISensitiveWordReplace replace = new MySensitiveWordReplace();
String result = SensitiveWordHelper.replace(text, replace);
public class MySensitiveWordReplace implements ISensitiveWordReplace {
@Override
public String replace(ISensitiveWordReplaceContext context) {
String sensitiveWord = context.sensitiveWord();
//五星红旗,毛主席铭感词来源可以为数据库
if("五星红旗".equals(sensitiveWord)) {
return "国家旗帜";
}
if("毛主席".equals(sensitiveWord)) {
return "教员";
}
// 其他默认使用 * 代替
int wordLength = context.wordLength();
return CharUtil.repeat('*', wordLength);
}
}
1.为了便于项目的开发,敏感词有一个新的工具类fluent-api 让开发方式更加简化
SensitiveWordBs wordBs = SensitiveWordBs.newInstance()
.ignoreCase(true) //忽略大小写
.ignoreWidth(true)//忽略半角圆角
.ignoreNumStyle(true)//忽略数字的写法
.ignoreChineseStyle(true)//忽略中文的书写格式
.ignoreEnglishStyle(true)//忽略英文的书写格式
.ignoreRepeat(true)//忽略重复词
.enableNumCheck(true)//是否启用数字检测。默认连续 8 位数字认为是敏感词
.enableEmailCheck(true)//是有启用邮箱检测
.enableUrlCheck(true)//是否启用链接检测
.init();
final String text = "五星红旗迎风飘扬,毛主席的画像屹立在天安门前。";
Assert.assertTrue(wordBs.contains(text));
在一般情况下在开发中会遇到一些关于敏感词范围过大或这敏感词范围不全这种情况,这个时候就会用到敏感词的白名单与黑名单
//黑名单
public class MyWordDeny implements IWordDeny {
@Override
public List<String> deny() {
return Arrays.asList("我的自定义敏感词");
}
}
//白名单
public class MyWordAllow implements IWordAllow {
@Override
public List<String> allow() {
return Arrays.asList("五星红旗");
}
}
@Configuration
public class SpringSensitiveWordConfig {
@Autowired
private MyDdWordAllow myDdWordAllow;
@Autowired
private MyDdWordDeny myDdWordDeny;
/**
* 初始化引导类
* @return 初始化引导类
* @since 1.0.0
*/
@Bean
public SensitiveWordBs sensitiveWordBs() {
SensitiveWordBs sensitiveWordBs = SensitiveWordBs.newInstance()
.wordAllow(WordAllows.chains(WordAllows.system(), myDdWordAllow))
.wordDeny(WordDenys.chains(WordDenys.system(), myDdWordDenys))
// 各种其他配置
.init();
return sensitiveWordBs;
}
}
如果使用的敏感词白名单与黑名单的数据来源为第三方,或者当敏感词库发生更新时就需要重新加载敏感词,此时也公共了一个方法,这个方法需要手动触发,或者定时任务触发
@Component
public class SensitiveWordService {
@Autowired
private SpringSensitiveWordConfig springSensitiveWordConfig;
/**
* 更新词库
*
* 每次数据库的信息发生变化之后,首先调用更新数据库敏感词库的方法。
* 如果需要生效,则调用这个方法。
*
* 说明:重新初始化不影响旧的方法使用。初始化完成后,会以新的为准。
*/
public void refresh() {
// 每次数据库的信息发生变化之后,首先调用更新数据库敏感词库的方法,然后调用这个方法。
springSensitiveWordConfig.sensitiveWordBs.init();
}
}
final String text = "五星红旗迎风飘扬,毛主席的画像屹立在天安门前。";
String replace = springSensitiveWordConfig.sensitiveWordBs().replace(text);