敏感词工具(sensitive word)的使用

敏感词工具(sensitive word)的使用

  • 开始
    • 优点
    • 准备
      • 1.引入对应的包地址
      • 2.常用api盖览
    • 使用实例
      • 1.是否有敏感词存在
      • 2.返回所有敏感词
      • 3.默认的替换策略
      • 4.指定替换词
    • 新工具类
      • 测试新工具

开始

sensitive word工具是一个快速的敏感词过滤工具,基于 DFA 算法实现的高性能敏感词工具。

优点

1.DFA算法是相比于其他算发性能更高,所读更改快
2.其中包含默认的敏感词共6W
3.支持自定替换,支持手动扩展敏感词词库,也可以放行敏感词,方形掉相对于使用方不敏感的词语
3.支持运行时加载敏感词词库,无需进行重新部署

准备

1.引入对应的包地址

    
        com.github.houbb
        sensitive-word
        0.2.0
    

2.常用api盖览

方法 参数 返回值 说明
contains(String) 待验证的字符串 boolean false为不存在敏感词,true为存在敏感词
findAll(String) 待验证的字符串 List 返回值为待验证字符串中敏感词集合
replace(String) 待验证的字符串 String 将敏感词使用*替换之后的字符

使用实例

1.是否有敏感词存在

final String text = "五星红旗迎风飘扬,画像屹立在天安门前。";

boolean isFalse = SensitiveWordHelper.contains(text);

2.返回所有敏感词

final String text = "五星红旗迎风飘扬,画像屹立在天安门前。";

List<String> wordList = SensitiveWordHelper.findAll(text);

3.默认的替换策略

final String text = "五星红旗迎风飘扬,画像屹立在天安门前。";

String result = SensitiveWordHelper.replace(text);

4.指定替换词


    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);

你可能感兴趣的:(java,spring,boot)