diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sensitiveword/SensitiveWordService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sensitiveword/SensitiveWordService.java index 658039cd23..ab23a15c4b 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sensitiveword/SensitiveWordService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sensitiveword/SensitiveWordService.java @@ -88,11 +88,11 @@ public interface SensitiveWordService { List validateText(String text, List tags); /** - * 判断文本是否包含敏感词 + * 判断文本是否合法 * * @param text 文本 - * @param tags 表述数组 - * @return 是否包含 + * @param tags 标签数组 + * @return 是否合法 true-合法 false-不合法 */ boolean isTextValid(String text, List tags); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sensitiveword/SensitiveWordServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sensitiveword/SensitiveWordServiceImpl.java index ea0402dfc8..9c41941ef2 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sensitiveword/SensitiveWordServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sensitiveword/SensitiveWordServiceImpl.java @@ -258,9 +258,7 @@ public class SensitiveWordServiceImpl implements SensitiveWordService { if (trie == null) { continue; } - if (!trie.isValid(text)) { - return false; - } + return trie.isValid(text); } return true; } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/util/collection/SimpleTrie.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/util/collection/SimpleTrie.java index 817eee3552..1a0a5c055a 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/util/collection/SimpleTrie.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/util/collection/SimpleTrie.java @@ -32,7 +32,7 @@ public class SimpleTrie { public SimpleTrie(Collection strs) { children = new HashMap<>(); // 构建树 - CollUtil.sort(strs, String::compareTo); // 排序,优先使用较短的前缀 + strs = CollUtil.sort(strs, String::compareTo); // 排序,优先使用较短的前缀 for (String str : strs) { Map child = children; // 遍历每个字符 @@ -56,11 +56,11 @@ public class SimpleTrie { * 验证文本是否合法,即不包含敏感词 * * @param text 文本 - * @return 是否 ok + * @return 是否 true-合法 false-不合法 */ public boolean isValid(String text) { // 遍历 text,使用每一个 [i, n) 段的字符串,使用 children 前缀树匹配,是否包含敏感词 - for (int i = 0; i < text.length() - 1; i++) { + for (int i = 0; i < text.length() ; i++) { Map child = (Map) children.get(text.charAt(i)); if (child == null) { continue; @@ -74,14 +74,17 @@ public class SimpleTrie { } /** - * 验证文本从指定位置开始,是否包含某个敏感词 + * 验证文本从指定位置开始,是否不包含某个敏感词 * * @param text 文本 * @param index 开始位置 * @param child 节点(当前遍历到的) - * @return 是否包含 + * @return 是否不包含 true-不包含 false-包含 */ private boolean recursion(String text, int index, Map child) { + if (child.containsKey(CHARACTER_END)) { + return false; + } if (index == text.length()) { return true; } @@ -99,7 +102,7 @@ public class SimpleTrie { */ public List validate(String text) { Set results = new HashSet<>(); - for (int i = 0; i < text.length() - 1; i++) { + for (int i = 0; i < text.length(); i++) { Character c = text.charAt(i); Map child = (Map) children.get(c); if (child == null) { @@ -123,10 +126,13 @@ public class SimpleTrie { * @param index 开始未知 * @param child 节点(当前遍历到的) * @param result 返回敏感词 - * @return 是否有敏感词 + * @return 是否无敏感词 true-无 false-有 */ @SuppressWarnings("unchecked") private static boolean recursionWithResult(String text, int index, Map child, StringBuilder result) { + if (child.containsKey(CHARACTER_END)) { + return false; + } if (index == text.length()) { return true; } diff --git a/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sensitiveword/SensitiveWordServiceImplTest.java b/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sensitiveword/SensitiveWordServiceImplTest.java index 72ce16692a..be566e2ede 100644 --- a/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sensitiveword/SensitiveWordServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sensitiveword/SensitiveWordServiceImplTest.java @@ -56,20 +56,28 @@ public class SensitiveWordServiceImplTest extends BaseDbUnitTest { SensitiveWordDO wordDO2 = randomPojo(SensitiveWordDO.class, o -> o.setName("笨蛋") .setTags(singletonList("蔬菜")).setStatus(CommonStatusEnum.ENABLE.getStatus())); sensitiveWordMapper.insert(wordDO2); + SensitiveWordDO wordDO3 = randomPojo(SensitiveWordDO.class, o -> o.setName("白") + .setTags(singletonList("测试")).setStatus(CommonStatusEnum.ENABLE.getStatus())); + sensitiveWordMapper.insert(wordDO3); + SensitiveWordDO wordDO4 = randomPojo(SensitiveWordDO.class, o -> o.setName("白痴") + .setTags(singletonList("测试")).setStatus(CommonStatusEnum.ENABLE.getStatus())); + sensitiveWordMapper.insert(wordDO4); // 调用 sensitiveWordService.initLocalCache(); // 断言 sensitiveWordTagsCache 缓存 - assertEquals(SetUtils.asSet("论坛", "蔬菜"), sensitiveWordService.getSensitiveWordTagSet()); + assertEquals(SetUtils.asSet("论坛", "蔬菜","测试"), sensitiveWordService.getSensitiveWordTagSet()); // 断言 sensitiveWordCache - assertEquals(2, sensitiveWordService.getSensitiveWordCache().size()); + assertEquals(4, sensitiveWordService.getSensitiveWordCache().size()); assertPojoEquals(wordDO1, sensitiveWordService.getSensitiveWordCache().get(0)); assertPojoEquals(wordDO2, sensitiveWordService.getSensitiveWordCache().get(1)); + assertPojoEquals(wordDO3, sensitiveWordService.getSensitiveWordCache().get(2)); // 断言 tagSensitiveWordTries 缓存 assertNotNull(sensitiveWordService.getDefaultSensitiveWordTrie()); - assertEquals(2, sensitiveWordService.getTagSensitiveWordTries().size()); + assertEquals(3, sensitiveWordService.getTagSensitiveWordTries().size()); assertNotNull(sensitiveWordService.getTagSensitiveWordTries().get("论坛")); assertNotNull(sensitiveWordService.getTagSensitiveWordTries().get("蔬菜")); + assertNotNull(sensitiveWordService.getTagSensitiveWordTries().get("测试")); } @Test @@ -236,6 +244,14 @@ public class SensitiveWordServiceImplTest extends BaseDbUnitTest { List result = sensitiveWordService.validateText(text, null); // 断言 assertEquals(Arrays.asList("傻瓜", "笨蛋"), result); + + // 准备参数 + String text2 = "你是傻瓜,你是笨蛋,你是白"; + + // 调用 + List result2 = sensitiveWordService.validateText(text2, null); + // 断言 + assertEquals(Arrays.asList("傻瓜", "笨蛋","白"), result2); } @Test @@ -248,6 +264,16 @@ public class SensitiveWordServiceImplTest extends BaseDbUnitTest { List result = sensitiveWordService.validateText(text, singletonList("论坛")); // 断言 assertEquals(singletonList("傻瓜"), result); + + + // 准备参数 + String text2 = "你是白"; + + // 调用 + List result2 = sensitiveWordService.validateText(text2, singletonList("测试")); + // 断言 + assertEquals(singletonList("白"), result2); + } @Test @@ -258,6 +284,12 @@ public class SensitiveWordServiceImplTest extends BaseDbUnitTest { // 调用,断言 assertFalse(sensitiveWordService.isTextValid(text, null)); + + // 准备参数 + String text2 = "你是白"; + + // 调用,断言 + assertFalse(sensitiveWordService.isTextValid(text2, null)); } @Test @@ -268,6 +300,12 @@ public class SensitiveWordServiceImplTest extends BaseDbUnitTest { // 调用,断言 assertFalse(sensitiveWordService.isTextValid(text, singletonList("论坛"))); + + // 准备参数 + String text2 = "你是白"; + + // 调用,断言 + assertFalse(sensitiveWordService.isTextValid(text2, singletonList("测试"))); } }