Có thể xây dựng chức năng kiểm tra từ nhạy cảm như một dịch vụ dùng chung, hỗ trợ linh hoạt và dễ tích hợp vào nhiều hệ thống.
1. Thư viện cần thiết
<dependency>
<groupId>com.github.houbb</groupId>
<artifactId>sensitive-word</artifactId>
<version>0.17.0</version>
</dependency>
2. Cấu hình khởi tạo bộ lọc
@Configuration
public class SensitiveFilterConfig {
@Resource
private CustomAllowList customAllowList;
@Resource
private CustomDenyList customDenyList;
@Bean
public SensitiveWordBs wordFilter() {
return SensitiveWordBs.newInstance()
.ignoreCase(true)
.ignoreWidth(true)
.ignoreNumStyle(true)
.ignoreChineseStyle(true)
.ignoreEnglishStyle(true)
.ignoreRepeat(true)
.enableWordCheck(true)
.enableNumCheck(true)
.charIgnore(SensitiveWordCharIgnores.specialChars())
.wordDeny(WordDenys.chains(WordDenys.defaults(), customDenyList))
.wordAllow(WordAllows.chains(WordAllows.defaults(), customAllowList))
.init();
}
}
3. Cấu hình danh sách cho phép và cấm
Các danh sách này có thể được cập nhật động từ cơ sở dữ liệu để phản ánh thay đổi theo thời gian thực.
@Component
public class CustomAllowList implements IWordAllow {
@Resource
private WordRepository wordRepo;
@Override
public List<String> allow() {
WordQuery query = new WordQuery();
query.setDeletedFlag(0);
query.setCategory(2); // Loại: cho phép
return wordRepo.find(query).stream()
.map(Word::getContent)
.collect(Collectors.toList());
}
}
@Component
public class CustomDenyList implements IWordDeny {
@Resource
private WordRepository wordRepo;
@Override
public List<String> deny() {
WordQuery query = new WordQuery();
query.setDeletedFlag(0);
query.setCategory(1); // Loại: cấm
return wordRepo.find(query).stream()
.map(Word::getContent)
.collect(Collectors.toList());
}
}
4. Cách sử dụng trong code
boolean hasSensitive = wordFilter.contains(inputText); // Kiểm tra xem văn bản có chứa từ nhạy cảm không
wordFilter.init(); // Khởi tạo lại bộ lọc khi cần làm mới danh sách từ
5. Cấu trúc bảng cơ sở dữ liệu
CREATE TABLE sensitive_word (
id INT UNSIGNED AUTO_INCREMENT COMMENT 'Khóa chính tự tăng',
content VARCHAR(128) NOT NULL COMMENT 'Từ khóa',
category TINYINT NULL COMMENT 'Loại: 1=cấm, 2=cho phép',
tags VARCHAR(200) NULL COMMENT 'Nhãn phân loại',
deleted_flag TINYINT DEFAULT 0 COMMENT 'Trạng thái xóa: 0=đang dùng, 1=đã xóa',
remark VARCHAR(200) DEFAULT '' NOT NULL COMMENT 'Ghi chú',
created_by BIGINT NULL COMMENT 'Người tạo',
updated_by BIGINT NULL COMMENT 'Người cập nhật',
created_at DATETIME NULL COMMENT 'Thời gian tạo',
updated_at DATETIME NULL COMMENT 'Thời gian cập nhật',
UNIQUE uk_content (content) COMMENT 'Chỉ mục duy nhất theo nội dung',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Bảng lưu trữ từ nhạy cảm';