springboot敏感词
时间: 2025-05-27 18:32:11 浏览: 45
### Spring Boot 中敏感词过滤的配置与实现
在 Spring Boot 应用程序中,可以通过多种方式实现敏感词过滤功能。以下是几种常见的方法及其具体实现。
#### 方法一:基于正则表达式的简单实现
通过编写简单的 Java 正则表达式逻辑来匹配并替换敏感词。这种方式适合小型应用或需求不复杂的场景。
```java
import java.util.HashSet;
import java.util.Set;
public class SimpleSensitiveFilter {
private Set<String> sensitiveWords = new HashSet<>();
public SimpleSensitiveFilter(Set<String> words) {
this.sensitiveWords.addAll(words);
}
public String filter(String text) {
if (text == null || text.isEmpty()) {
return text;
}
for (String word : sensitiveWords) {
text = text.replaceAll(word, "*".repeat(word.length()));
}
return text;
}
}
```
此代码片段展示了如何定义一个 `SimpleSensitiveFilter` 类[^1],用于加载一组敏感词并将它们从输入字符串中移除或隐藏。
---
#### 方法二:集成 Redis 的高效实现
当敏感词列表较大时,可以利用 Redis 缓存存储敏感词以提高查询效率。这种方案适用于高并发环境下的大规模数据处理。
##### 1. 配置 Redis
在项目的 `application.yml` 文件中添加 Redis 配置:
```yaml
spring:
redis:
host: localhost
port: 6379
database: 0
timeout: 10000
```
以上 YAML 片段说明了如何设置 Redis 连接参数[^2]。
##### 2. 使用 Redis 存储敏感词
将敏感词保存到 Redis 列表或其他合适的数据结构中,并提供接口供应用程序访问这些词语。
```java
@Service
public class SensitiveWordService {
@Autowired
private StringRedisTemplate redisTemplate;
public void addSensitiveWord(String word) {
redisTemplate.opsForSet().add("sensitive_words", word);
}
public boolean contains(String content) {
List<String> words = redisTemplate.opsForSet().members("sensitive_words");
for (String word : words) {
if (content.contains(word)) {
return true;
}
}
return false;
}
public String replace(String content) {
List<String> words = redisTemplate.opsForSet().members("sensitive_words");
for (String word : words) {
content = content.replace(word, "*".repeat(word.length()));
}
return content;
}
}
```
该服务类实现了向 Redis 添加敏感词的功能以及检测和替换文本中的敏感词操作[^4]。
---
#### 方法三:AC 自动机算法优化性能
如果需要更高效的解决方案,则可采用 AC 自动机(Aho-Corasick Algorithm)。这是一种经典的多模式串匹配算法,在大量关键词的情况下表现尤为出色。
##### 依赖引入
需先导入第三方库支持 AC 自动机构建,例如 Apache Commons Text 提供的相关工具包。
```xml
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>1.10.0</version>
</dependency>
```
##### 实现代码
下面是一个使用 Apache Commons Text 构建 AC 自动机的例子:
```java
import org.apache.commons.text.similarity.AhoCorasickDoubleArrayTrie;
import java.util.Collections;
import java.util.Map;
public class AcSensitiveFilter {
private final AhoCorasickDoubleArrayTrie<String> trie;
public AcSensitiveFilter(Map<String, String> keywordsMap) {
this.trie = new AhoCorasickDoubleArrayTrie<>(keywordsMap);
}
public String filter(String input) {
StringBuilder sb = new StringBuilder(input);
Map<Integer, String> resultMap = Collections.emptyMap();
trie.parseText(sb.toString(), (beginIndex, endIndex, value) -> {
int index = beginIndex + value.length();
resultMap.put(index, value);
});
for (Integer key : resultMap.keySet()) {
String replacement = "*".repeat(resultMap.get(key).length());
sb.replace(key, key + resultMap.get(key).length(), replacement);
}
return sb.toString();
}
}
```
上述代码展示了一个基于 AC 自动机的高性能敏感词过滤器[^4]。
---
### 测试案例
无论选用哪种方法,都需要设计单元测试验证其正确性和稳定性。以下是一组通用的 JUnit 测试用例模板:
```java
@SpringBootTest
class SensitiveFilterTest {
@Autowired
private SensitiveFilter sensitiveFilter;
@Test
void testFilter() {
String original = "accfuckxx元bitch购物车bitchjwbc";
String filtered = sensitiveFilter.filter(original);
assertEquals("acc****xx元****购物车****jwbc", filtered);
}
}
```
这段测试脚本检查了给定字符串经过敏感词过滤后的预期结果是否一致。
---
阅读全文
相关推荐



















