8000 GitHub - tadaydayup/sensitive-word: 👮â€â™‚ï¸The sensitive word tool for java.(基于 DFA 算法实现的高性能 java æ•æ„Ÿè¯å·¥å…·æ¡†æž¶ã€‚请勿å‘å¸ƒæ¶‰åŠæ”¿æ²»ã€å¹¿å‘Šã€è¥é”€ã€ç¿»å¢™ã€è¿å国家法律法规等内容。)
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

👮â€â™‚ï¸The sensitive word tool for java.(基于 DFA 算法实现的高性能 java æ•æ„Ÿè¯å·¥å…·æ¡†æž¶ã€‚请勿å‘å¸ƒæ¶‰åŠæ”¿æ²»ã€å¹¿å‘Šã€è¥é”€ã€ç¿»å¢™ã€è¿å国家法律法规等内容。)

License

Notifications You must be signed in to change notification settings

tadaydayup/sensitive-word

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

80 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

sensitive-word

sensitive-word 基于 DFA ç®—æ³•å®žçŽ°çš„é«˜æ€§èƒ½æ•æ„Ÿè¯å·¥å…·ã€‚

Maven Central Open Source Love

在线体验

创作目的

å®žçŽ°ä¸€æ¬¾å¥½ç”¨æ•æ„Ÿè¯å·¥å…·ã€‚

基于 DFA ç®—æ³•å®žçŽ°ï¼Œç›®å‰æ•感è¯åº“内容收录 6W+ï¼ˆæºæ–‡ä»¶ 18W+,ç»è¿‡ä¸€æ¬¡åˆ å‡ï¼‰ã€‚

åŽæœŸå°†è¿›è¡ŒæŒç»­ä¼˜åŒ–å’Œè¡¥å……æ•æ„Ÿè¯åº“,并进一步æå‡ç®—法的性能。

希望å¯ä»¥ç»†åŒ–æ•æ„Ÿè¯çš„åˆ†ç±»ï¼Œæ„Ÿè§‰å·¥ä½œé‡æ¯”较大,暂时没有进行。

特性

  • 6W+ è¯åº“ï¼Œä¸”ä¸æ–­ä¼˜åŒ–æ›´æ–°

  • 基于 DFA 算法,性能较好

  • 基于 fluent-api 实现,使用优雅简æ´

  • æ”¯æŒæ•感è¯çš„判断ã€è¿”回ã€è„±æ•ç­‰å¸¸è§æ“作

  • 支æŒå…¨è§’åŠè§’互æ¢

  • 支æŒè‹±æ–‡å¤§å°å†™äº’æ¢

  • æ”¯æŒæ•°å­—常è§å½¢å¼çš„互æ¢

  • 支æŒä¸­æ–‡ç¹ç®€ä½“互æ¢

  • 支æŒè‹±æ–‡å¸¸è§å½¢å¼çš„互æ¢

  • 支æŒç”¨æˆ·è‡ªå®šä¹‰æ•感è¯å’Œç™½åå•

  • æ”¯æŒæ•°æ®çš„æ•°æ®åŠ¨æ€æ›´æ–°ï¼Œå®žæ—¶ç”Ÿæ•ˆ

å˜æ›´æ—¥å¿—

CHANGE_LOG.md

v0.2.1 å˜æ›´ï¼š

  • 支æŒç”¨æˆ·è‡ªå®šä¹‰æ•°å­—检测的长度

快速开始

准备

  • JDK1.7+

  • Maven 3.x+

Maven 引入

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

api 概览

SensitiveWordHelper ä½œä¸ºæ•æ„Ÿè¯çš„工具类,核心方法如下:

方法 傿•° 返回值 说明
contains(String) 待验è¯çš„字符串 布尔值 验è¯å­—符串是å¦åŒ…嫿•感è¯
replace(String, ISensitiveWordReplace) 使用指定的替æ¢ç­–ç•¥æ›¿æ¢æ•æ„Ÿè¯ å­—ç¬¦ä¸² 返回脱æ•åŽçš„字符串
replace(String, char) 使用指定的 char æ›¿æ¢æ•æ„Ÿè¯ å­—ç¬¦ä¸² 返回脱æ•åŽçš„字符串
replace(String) 使用 * æ›¿æ¢æ•æ„Ÿè¯ å­—ç¬¦ä¸² 返回脱æ•åŽçš„字符串
findAll(String) 待验è¯çš„字符串 字符串列表 è¿”å›žå­—ç¬¦ä¸²ä¸­æ‰€æœ‰æ•æ„Ÿè¯
findFirst(String) 待验è¯çš„字符串 字符串 è¿”å›žå­—ç¬¦ä¸²ä¸­ç¬¬ä¸€ä¸ªæ•æ„Ÿè¯
findAll(String, IWordResultHandler) IWordResultHandler 结果处ç†ç±» 字符串列表 è¿”å›žå­—ç¬¦ä¸²ä¸­æ‰€æœ‰æ•æ„Ÿè¯
findFirst(String, IWordResultHandler) IWordResultHandler 结果处ç†ç±» 字符串 è¿”å›žå­—ç¬¦ä¸²ä¸­ç¬¬ä¸€ä¸ªæ•æ„Ÿè¯

IWordResultHandler å¯ä»¥å¯¹æ•感è¯çš„结果进行处ç†ï¼Œå…许用户自定义。

å†…ç½®å®žçŽ°è§ WordResultHandlers 工具类:

  • WordResultHandlers.word()

åªä¿ç•™æ•感è¯å•è¯æœ¬èº«ã€‚

  • WordResultHandlers.raw()

ä¿ç•™æ•感è¯ç›¸å…³ä¿¡æ¯ï¼ŒåŒ…嫿•感è¯ï¼Œå¼€å§‹å’Œç»“æŸä¸‹æ ‡ã€‚

使用实例

所有测试案例å‚è§ SensitiveWordHelperTest

判断是å¦åŒ…嫿•感è¯

final String text = "五星红旗迎风飘扬,毛主席的画åƒå±¹ç«‹åœ¨å¤©å®‰é—¨å‰ã€‚";

Assert.assertTrue(SensitiveWordHelper.contains(text));

è¿”å›žç¬¬ä¸€ä¸ªæ•æ„Ÿè¯

final String text = "五星红旗迎风飘扬,毛主席的画åƒå±¹ç«‹åœ¨å¤©å®‰é—¨å‰ã€‚";

String word = SensitiveWordHelper.findFirst(text);
Assert.assertEquals("五星红旗", word);

SensitiveWordHelper.findFirst(text) 等价于:

String word = SensitiveWordHelper.findFirst(text, WordResultHandlers.word());

WordResultHandlers.raw() å¯ä»¥ä¿ç•™å¯¹åº”的下标信æ¯ï¼š

final String text = "五星红旗迎风飘扬,毛主席的画åƒå±¹ç«‹åœ¨å¤©å®‰é—¨å‰ã€‚";

IWordResult word = SensitiveWordHelper.findFirst(text, WordResultHandlers.raw());
Assert.assertEquals("WordResult{word='五星红旗', startIndex=0, endIndex=4}", word.toString());

è¿”å›žæ‰€æœ‰æ•æ„Ÿè¯

final String text = "五星红旗迎风飘扬,毛主席的画åƒå±¹ç«‹åœ¨å¤©å®‰é—¨å‰ã€‚";

List<String> wordList = SensitiveWordHelper.findAll(text);
Assert.assertEquals("[五星红旗, 毛主席, 天安门]", wordList.toString());

è¿”å›žæ‰€æœ‰æ•æ„Ÿè¯ç”¨æ³•上类似于 SensitiveWordHelper.findFirst()ï¼ŒåŒæ ·ä¹Ÿæ”¯æŒæŒ‡å®šç»“果处ç†ç±»ã€‚

SensitiveWordHelper.findAll(text) 等价于:

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

WordResultHandlers.raw() å¯ä»¥ä¿ç•™å¯¹åº”的下标信æ¯ï¼š

final String text = "五星红旗迎风飘扬,毛主席的画åƒå±¹ç«‹åœ¨å¤©å®‰é—¨å‰ã€‚";

List<IWordResult> wordList = SensitiveWordHelper.findAll(text, WordResultHandlers.raw());
Assert.assertEquals("[WordResult{word='五星红旗', startIndex=0, endIndex=4}, WordResult{word='毛主席', startIndex=9, endIndex=12}, WordResult{word='天安门', startIndex=18, endIndex=21}]", wordList.toString());

默认的替æ¢ç­–ç•¥

final String text = "五星红旗迎风飘扬,毛主席的画åƒå±¹ç«‹åœ¨å¤©å®‰é—¨å‰ã€‚";
String result = SensitiveWordHelper.replace(text);
Assert.assertEquals("****迎风飘扬,***的画åƒå±¹ç«‹åœ¨***å‰ã€‚", result);

指定替æ¢çš„内容

final String text = "五星红旗迎风飘扬,毛主席的画åƒå±¹ç«‹åœ¨å¤©å®‰é—¨å‰ã€‚";
String result = SensitiveWordHelper.replace(text, '0');
Assert.assertEquals("0000迎风飘扬,000的画åƒå±¹ç«‹åœ¨000å‰ã€‚", result);

自定义替æ¢ç­–ç•¥

V0.2.0 支æŒè¯¥ç‰¹æ€§ã€‚

场景说明:有时候我们希望ä¸åŒçš„æ•æ„Ÿè¯æœ‰ä¸åŒçš„æ›¿æ¢ç»“æžœã€‚æ¯”å¦‚ã€æ¸¸æˆã€‘替æ¢ä¸ºã€ç”µå­ç«žæŠ€ã€‘,ã€å¤±ä¸šã€‘替æ¢ä¸ºã€çµæ´»å°±ä¸šã€‘。

诚然,æå‰ä½¿ç”¨å­—符串的正则替æ¢ä¹Ÿå¯ä»¥ï¼Œä¸è¿‡æ€§èƒ½ä¸€èˆ¬ã€‚

使用例å­ï¼š

/**
 * 自定替æ¢ç­–ç•¥
 * @since 0.2.0
 */
@Test
public void defineReplaceTest() {
    final String text = "五星红旗迎风飘扬,毛主席的画åƒå±¹ç«‹åœ¨å¤©å®‰é—¨å‰ã€‚";

    ISensitiveWordReplace replace = new MySensitiveWordReplace();
    String result = SensitiveWordHelper.replace(text, replace);

    Assert.assertEquals("国家旗帜迎风飘扬,教员的画åƒå±¹ç«‹åœ¨***å‰ã€‚", result);
}

其中 MySensitiveWordReplace 是我们自定义的替æ¢ç­–略,实现如下:

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

}

我们针对其中的部分è¯åšå›ºå®šæ˜ å°„处ç†ï¼Œå…¶ä»–的默认转æ¢ä¸º *。

更多特性

åŽç»­çš„è¯¸å¤šç‰¹æ€§ï¼Œä¸»è¦æ˜¯é’ˆå¯¹å„ç§é’ˆå¯¹å„ç§æƒ…况的处ç†ï¼Œå°½å¯èƒ½çš„æå‡æ•感è¯å‘½ä¸­çŽ‡ã€‚

这是一场漫长的攻防之战。

忽略大å°å†™

final String text = "fuCK the bad words.";

String word = SensitiveWordHelper.findFirst(text);
Assert.assertEquals("fuCK", word);

忽略åŠè§’圆角

final String text = "fuck the bad words.";

String word = SensitiveWordHelper.findFirst(text);
Assert.assertEquals("fuck", word);

忽略数字的写法

这里实现了数字常è§å½¢å¼çš„转æ¢ã€‚

final String text = "这个是我的微信:9⓿二肆â¹â‚ˆâ‘¢â‘¸â’‹âžƒãˆ¤ãŠ„";

List<String> wordList = SensitiveWordHelper.findAll(text);
Assert.assertEquals("[9⓿二肆â¹â‚ˆâ‘¢â‘¸â’‹âžƒãˆ¤ãŠ„]", wordList.toString());

忽略ç¹ç®€ä½“

final String text = "我爱我的祖国和五星紅旗。";

List<String> wordList = SensitiveWordHelper.findAll(text);
Assert.assertEquals("[五星紅旗]", wordList.toString());

忽略英文的书写格å¼

final String text = "Ⓕⓤc⒦ the bad words";

List<String> wordList = SensitiveWordHelper.findAll(text);
Assert.assertEquals("[Ⓕⓤc⒦]", wordList.toString());

忽略é‡å¤è¯

final String text = "ⒻⒻⒻfⓤuⓤ⒰cⓒ⒦ the bad words";

List<String> wordList = SensitiveWordBs.newInstance()
        .ignoreRepeat(true)
        .findAll(text);
Assert.assertEquals("[ⒻⒻⒻfⓤuⓤ⒰cⓒ⒦]", wordList.toString());

邮箱检测

final String text = "楼主好人,邮箱 sensitiveword@xx.com";

List<String> wordList = SensitiveWordHelper.findAll(text);
Assert.assertEquals("[sensitiveword@xx.com]", wordList.toString());

连续数字检测

一般用于过滤手机å·/QQ等广告信æ¯ã€‚

V0.2.1 之åŽï¼Œæ”¯æŒé€šè¿‡ numCheckLen(长度) 自定义检测的长度。

final String text = "你懂得:12345678";

// 默认检测 8 ä½
List<String> wordList = SensitiveWordBs.newInstance().findAll(text);
Assert.assertEquals("[12345678]", wordList.toString());

// 指定数字的长度,é¿å…误æ€
List<String> wordList2 = SensitiveWordBs.newInstance()
        .numCheckLen(9)
        .findAll(text);
Assert.assertEquals("[]", wordList2.toString());

特性é…ç½®

说明

上é¢çš„特性默认都是开å¯çš„,有时业务需è¦çµæ´»å®šä¹‰ç›¸å…³çš„é…置特性。

所以 v0.0.14 开放了属性é…置。

é…置方法

为了让使用更加优雅,统一使用 fluent-api 的方å¼å®šä¹‰ã€‚

用户å¯ä»¥ä½¿ç”¨ SensitiveWordBs 进行如下定义:

SensitiveWordBs wordBs = SensitiveWordBs.newInstance()
        .ignoreCase(true)
        .ignoreWidth(true)
        .ignoreNumStyle(true)
        .ignoreChineseStyle(true)
        .ignoreEnglishStyle(true)
        .ignoreRepeat(false)
        .enableNumCheck(true)
        .enableEmailCheck(true)
        .enableUrlCheck(true)
        .numCheckLen(8)
        .init();

final String text = "五星红旗迎风飘扬,毛主席的画åƒå±¹ç«‹åœ¨å¤©å®‰é—¨å‰ã€‚";
Assert.assertTrue(wordBs.contains(text));

é…置说明

其中å„项é…置的说明如下:

åºå· 方法 说明 默认值
1 ignoreCase 忽略大å°å†™ true
2 ignoreWidth 忽略åŠè§’圆角 true
3 ignoreNumStyle 忽略数字的写法 true
4 ignoreChineseStyle å¿½ç•¥ä¸­æ–‡çš„ä¹¦å†™æ ¼å¼ true
5 ignoreEnglishStyle å¿½ç•¥è‹±æ–‡çš„ä¹¦å†™æ ¼å¼ true
6 ignoreRepeat 忽略é‡å¤è¯ false
7 enableNumCheck 是å¦å¯ç”¨æ•°å­—检测。 true
8 enableEmailCheck 是有å¯ç”¨é‚®ç®±æ£€æµ‹ true
9 enableUrlCheck 是å¦å¯ç”¨é“¾æŽ¥æ£€æµ‹ true
10 numCheckLen 数字检测,自定义指定长度。 8

动æ€åŠ è½½ï¼ˆç”¨æˆ·è‡ªå®šä¹‰ï¼‰

情景说明

æœ‰æ—¶å€™æˆ‘ä»¬å¸Œæœ›å°†æ•æ„Ÿè¯çš„加载设计æˆåЍæ€çš„,比如控å°ä¿®æ”¹ï¼Œç„¶åŽå¯ä»¥å®žæ—¶ç”Ÿæ•ˆã€‚

v0.0.13 支æŒäº†è¿™ç§ç‰¹æ€§ã€‚

接å£è¯´æ˜Ž

为了实现这个特性,并且兼容以å‰çš„功能,我们定义了两个接å£ã€‚

IWordDeny

接å£å¦‚下,å¯ä»¥è‡ªå®šä¹‰è‡ªå·±çš„实现。

è¿”å›žçš„åˆ—è¡¨ï¼Œè¡¨ç¤ºè¿™ä¸ªè¯æ˜¯ä¸€ä¸ªæ•感è¯ã€‚

/**
 * æ‹’ç»å‡ºçŽ°çš„æ•°æ®-è¿”å›žçš„å†…å®¹è¢«å½“åšæ˜¯æ•感è¯
 * @author binbin.hou
 * @since 0.0.13
 */
public interface IWordDeny {

    /**
     * 获å–结果
     * @return 结果
     * @since 0.0.13
     */
    List<String> deny();

}

比如:

public class MyWordDeny implements IWordDeny {

    @Override
    public List<String> deny() {
        return Arrays.asList("æˆ‘çš„è‡ªå®šä¹‰æ•æ„Ÿè¯");
    }

}

IWordAllow

接å£å¦‚下,å¯ä»¥è‡ªå®šä¹‰è‡ªå·±çš„实现。

返回的列表,表示这个è¯ä¸æ˜¯ä¸€ä¸ªæ•感è¯ã€‚

/**
 * å…许的内容-返回的内容ä¸è¢«å½“åšæ•感è¯
 * @author binbin.hou
 * @since 0.0.13
 */
public interface IWordAllow {

    /**
     * 获å–结果
     * @return 结果
     * @since 0.0.13
     */
    List<String> allow();

}

如:

public class MyWordAllow implements IWordAllow {

    @Override
    public List<String> allow() {
        return Arrays.asList("五星红旗");
    }

}

é…置使用

接å£è‡ªå®šä¹‰ä¹‹åŽï¼Œå½“ç„¶éœ€è¦æŒ‡å®šæ‰èƒ½ç”Ÿæ•ˆã€‚

为了让使用更加优雅,我们设计了引导类 SensitiveWordBs。

å¯ä»¥é€šè¿‡ wordDeny() æŒ‡å®šæ•æ„Ÿè¯ï¼ŒwordAllow() æŒ‡å®šéžæ•感è¯ï¼Œé€šè¿‡ init() åˆå§‹åŒ–æ•æ„Ÿè¯å­—典。

系统的默认é…ç½®

SensitiveWordBs wordBs = SensitiveWordBs.newInstance()
        .wordDeny(WordDenys.system())
        .wordAllow(WordAllows.system())
        .init();

final String text = "五星红旗迎风飘扬,毛主席的画åƒå±¹ç«‹åœ¨å¤©å®‰é—¨å‰ã€‚";
Assert.assertTrue(wordBs.contains(text));

备注:init() å¯¹äºŽæ•æ„Ÿè¯ DFA 的构建是比较耗时的,一般建议在应用åˆå§‹åŒ–的时候åªåˆå§‹åŒ–ä¸€æ¬¡ã€‚è€Œä¸æ˜¯é‡å¤åˆå§‹åŒ–ï¼

指定自己的实现

我们å¯ä»¥æµ‹è¯•一下自定义的实现,如下:

String text = "è¿™æ˜¯ä¸€ä¸ªæµ‹è¯•ï¼Œæˆ‘çš„è‡ªå®šä¹‰æ•æ„Ÿè¯ã€‚";

SensitiveWordBs wordBs = SensitiveWordBs.newInstance()
        .wordDeny(new MyWordDeny())
        .wordAllow(new MyWordAllow())
        .init();

Assert.assertEquals("[æˆ‘çš„è‡ªå®šä¹‰æ•æ„Ÿè¯]", wordBs.findAll(text).toString());

è¿™é‡Œåªæœ‰ æˆ‘çš„è‡ªå®šä¹‰æ•æ„Ÿè¯ æ˜¯æ•æ„Ÿè¯ï¼Œè€Œ 测试 䏿˜¯æ•感è¯ã€‚

当然,这里是全部使用我们自定义的实现,一般建议使用系统的默认é…ç½®+自定义é…置。

å¯ä»¥ä½¿ç”¨ä¸‹é¢çš„æ–¹å¼ã€‚

åŒæ—¶é…置多个

  • å¤šä¸ªæ•æ„Ÿè¯

WordDenys.chains() 方法,将多个实现åˆå¹¶ä¸ºåŒä¸€ä¸ª IWordDeny。

  • 多个白åå•

WordAllows.chains() 方法,将多个实现åˆå¹¶ä¸ºåŒä¸€ä¸ª IWordAllow。

例å­ï¼š

String text = "è¿™æ˜¯ä¸€ä¸ªæµ‹è¯•ã€‚æˆ‘çš„è‡ªå®šä¹‰æ•æ„Ÿè¯ã€‚";

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

Assert.assertEquals("[æˆ‘çš„è‡ªå®šä¹‰æ•æ„Ÿè¯]", wordBs.findAll(text).toString());

è¿™é‡Œéƒ½æ˜¯åŒæ—¶ä½¿ç”¨äº†ç³»ç»Ÿé»˜è®¤é…置,和自定义的é…置。

spring æ•´åˆ

背景

实际使用中,比如å¯ä»¥åœ¨é¡µé¢é…置修改,然åŽå®žæ—¶ç”Ÿæ•ˆã€‚

æ•°æ®å­˜å‚¨åœ¨æ•°æ®åº“ä¸­ï¼Œä¸‹é¢æ˜¯ä¸€ä¸ªä¼ªä»£ç çš„例å­ï¼Œå¯ä»¥å‚考 SpringSensitiveWordConfig.java

è¦æ±‚,版本 v0.0.15 åŠå…¶ä»¥ä¸Šã€‚

è‡ªå®šä¹‰æ•°æ®æº

简化伪代ç å¦‚下,数æ®çš„æºå¤´ä¸ºæ•°æ®åº“。

MyDdWordAllow å’Œ MyDdWordDeny 是基于数æ®åº“为æºå¤´çš„自定义实现类。

@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(myDdWordDeny)
                // å„ç§å…¶ä»–é…ç½®
                .init();

        return sensitiveWordBs;
    }

}

æ•æ„Ÿè¯åº“çš„åˆå§‹åŒ–较为耗时,建议程åºå¯åŠ¨æ—¶åšä¸€æ¬¡ init åˆå§‹åŒ–。

动æ€å˜æ›´

为了ä¿è¯æ•感è¯ä¿®æ”¹å¯ä»¥å®žæ—¶ç”Ÿæ•ˆä¸”ä¿è¯æŽ¥å£çš„å°½å¯èƒ½ç®€åŒ–,此处没有新增 add/remove 的方法。

而是在调用 sensitiveWordBs.init() çš„æ—¶å€™ï¼Œæ ¹æ® IWordDeny+IWordAllow 釿–°æž„å»ºæ•æ„Ÿè¯åº“。

因为åˆå§‹åŒ–å¯èƒ½è€—时较长(秒级别),所有优化为 init æœªå®Œæˆæ—¶ä¸å½±å“æ—§çš„è¯åº“功能,完æˆåŽä»¥æ–°çš„为准。

@Component
public class SensitiveWordService {

    @Autowired
    private SensitiveWordBs sensitiveWordBs;

    /**
     * æ›´æ–°è¯åº“
     *
     * æ¯æ¬¡æ•°æ®åº“的信æ¯å‘生å˜åŒ–之åŽï¼Œé¦–先调用更新数æ®åº“æ•æ„Ÿè¯åº“的方法。
     * 如果需è¦ç”Ÿæ•ˆï¼Œåˆ™è°ƒç”¨è¿™ä¸ªæ–¹æ³•。
     *
     * è¯´æ˜Žï¼šé‡æ–°åˆå§‹åŒ–ä¸å½±å“旧的方法使用。åˆå§‹åŒ–完æˆåŽï¼Œä¼šä»¥æ–°çš„为准。
     */
    public void refresh() {
        // æ¯æ¬¡æ•°æ®åº“的信æ¯å‘生å˜åŒ–之åŽï¼Œé¦–先调用更新数æ®åº“æ•æ„Ÿè¯åº“的方法,然åŽè°ƒç”¨è¿™ä¸ªæ–¹æ³•。
        sensitiveWordBs.init();
    }

}

如上,你å¯ä»¥åœ¨æ•°æ®åº“è¯åº“å‘ç”Ÿå˜æ›´æ—¶ï¼Œéœ€è¦è¯åº“生效,主动触å‘一次åˆå§‹åŒ– sensitiveWordBs.init();。

å…¶ä»–ä½¿ç”¨ä¿æŒä¸å˜ï¼Œæ— éœ€é‡å¯åº”用。

STAR

Stargazers over time

åŽæœŸ road-map

  • åŒéŸ³å­—处ç†

  • 形近字处ç†

  • 文字镜åƒç¿»è½¬

  • 文字é™å™ªå¤„ç†

  • æ•æ„Ÿè¯æ ‡ç­¾æ”¯æŒ

  • DFA æ•°æ®ç»“构的å¦ä¸€ç§å®žçް

拓展阅读

æ•æ„Ÿè¯å·¥å…·å®žçްæ€è·¯

DFA 算法讲解

æ•æ„Ÿè¯åº“优化æµç¨‹

java 如何实现开箱å³ç”¨çš„æ•æ„Ÿè¯æŽ§å°æœåŠ¡ï¼Ÿ

wechat

NLP å¼€æºçŸ©é˜µ

pinyin 汉字转拼音

pinyin2hanzi 拼音转汉字

segment 高性能中文分è¯

opencc4j 中文ç¹ç®€ä½“转æ¢

nlp-hanzi-similar 汉字相似度

word-checker 拼写检测

sensitive-word æ•æ„Ÿè¯

About

👮â€â™‚ï¸The sensitive word tool for java.(基于 DFA 算法实现的高性能 java æ•æ„Ÿè¯å·¥å…·æ¡†æž¶ã€‚请勿å‘å¸ƒæ¶‰åŠæ”¿æ²»ã€å¹¿å‘Šã€è¥é”€ã€ç¿»å¢™ã€è¿å国家法律法规等内容。)

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 96.2%
  • Shell 2.7%
  • Batchfile 1.1%
0