前提说明:
本文描述可能存在问题,如果不理解私信或者问下评论,看到就解答。
文中因为测试需要用到脏话,可能会被和谐,大家发挥自己的想象力去自动处理被和谐部分。[手动狗头]
一.数据库设置
- 新创建两个表(敏感词设置,白名单)
CREATE TABLE `word_deny` (
`id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'id',
`ignore_case` tinyint(0) NULL DEFAULT NULL COMMENT '是否忽略大小写',
`ignore_width` tinyint(0) NULL DEFAULT NULL COMMENT '是否忽略全角、半角',
`ignore_num_style` tinyint(0) NULL DEFAULT NULL COMMENT '是否忽略数字样式',
`ignore_chinese_style` tinyint(0) NULL DEFAULT NULL COMMENT '是否忽略中文样式',
`ignore_english_style` tinyint(0) NULL DEFAULT NULL COMMENT '是否忽略英文样式',
`ignore_repeat` tinyint(0) NULL DEFAULT NULL COMMENT '是否忽略重复',
`word_deny` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '敏感词内容',
`create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
`update_time` timestamp(0) NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
`default_deny` tinyint(0) NOT NULL DEFAULT 1 COMMENT '是否默认敏感词配置',
`default_allow` tinyint(0) NOT NULL DEFAULT 1 COMMENT '是否默认敏感词白名单配置',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '敏感词设置' ROW_FORMAT = Dynamic;
CREATE TABLE `word_allow` (
`id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'id',
`word_allow` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '白名单词',
`create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
`update_time` timestamp(0) NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '敏感词白名单' ROW_FORMAT = Dynamic;
备注:敏感词配置只能存在一条数据。注意在配置的时候不能重复新增。
二.情况分析
针对上述数据库配置,一共会出现四种情况。
- 数据库
没有设置敏感词和白名单
或者设置了,也是设置的都是使用默认值(全是用默认值)- 数据库设置了自定义敏感词和自定义白名单(全是自定义)
- 数据库设置默认的敏感词和自定义白名单(敏感词:默认;白名单:自定义)
- 数据库设置自定义的敏感词和默认白名单(敏感词:自定义;白名单:默认)
三.情况演示(控制台输入)
接口展示
private final SensitiveWordBs sensitiveWordBs;
private final WordDenyService wordDenyService;
private final WordAllowService wordAllowService;
@PostMapping
public Res word(@RequestBody WordVo wordVo) {
String res = "";
String allowRes = "数据库中白名单为空";
WordDeny wordDeny = wordDenyService.getOne(Wrappers.emptyWrapper());//配置
List<WordAllow> wordAllowList = wordAllowService.list(Wrappers.emptyWrapper());//白名单
if (wordAllowList != null && wordAllowList.size() > 0) {
allowRes = wordAllowList.toString();
}
if (wordDeny == null) {
res = "数据库没有配置敏感词,使用默认的敏感词和白名单";
} else {
res = "数据库【" + (wordDeny.getDefaultDeny() ? "开启默认敏感词" : "【开启自定义敏感词】,自定义值:" + wordDeny.getWordDeny()) + "】,"
+ (wordDeny.getDefaultAllow() ? "【开启默认白名单】" : "【开启自定义白名单】,自定义值:" + allowRes);
}
String word = wordVo.getWord();
System.out.println("\33[36;1m该请求的设置:\033[0m" + res);
System.out.println("\33[36;1m请求中被检测的字符串:\033[0m" + word);
System.out.println("\33[36;1m字符串中是否包含铭感词:\033[0m" + (sensitiveWordBs.contains(word) ? "【包含】" : "【不包含】"));
System.out.println("\33[36;1m查找所有铭感词:\033[0m" + sensitiveWordBs.findAll(word));
System.out.println