使用springboot实现过滤敏感词功能

一,在springboot项目的resources目录里创建sensitive-words.text(敏感词文本)

每个词独自一行

列如:

赌博

吸毒

开票

二,在util创建工具类SensitiveFilter

js 复制代码
package com.nowcoder.community.util;

@Component
public class SensitiveFilter{

	private static final Logger logger = LoggerFactory.getLogger(SensitiveFilter.class);

	// 替换符
	private static final String REPLACMENT = "***";

	// 根节点
	private TrieNode rootNode = new TrieNode();
	
	@PostConstruct
	public void init(){
		try(
			InputStream is = this.getClass().getClassLoader().getResourceAsStream("sebsitive-words.txt");
			BufferedReader reader = new BufferedReader(new InputStreamReader(is));
		){
			String keyword;
			while((keyword = reader.readLine()) != null){
				// 添加到前缀树
				this.addkeyword(keyword);
			}
		} catch(IOException e){
			logger.error("加载敏感词文件失败:"+ e.getMessage())
		}
	}
	
	// 将一个敏感词添加到前缀树里
	private void addKeyword(String keyword) {	
		TrieNode tempNode = rootNode;
		for(int i = 0; i < keyword.length(); i++ ){
			char c = keyword.charAT(i);
			TrieNode subNode = tempNode.getSubNode(c);

			if(subNode == null){
				// 初始化子节点
				subNode = new TrieNode();
				tempNode.addSubNode(c,subNode);
			}
			
			// 指向子节点,进入下一轮循环
			tempNode = subNode;
			
			// 设置结束标识
			if(i == keyword.length() - 1){
				tempNode.setKeywordEnd(true);
			}
		}
	}
	
	/**
	* 过滤敏感词
	*
	* @param text 待过滤文本
	* @return 过滤后的文本
	*/
	public String filter(String text){
		if(StringUtils.isBlank(text)){
			return null;
		}
		
		// 指针1
		TrieNode tempNode = rootNode;
		// 指针2
		int begin = 0;
		// 指针3
		int position = 0;
		// 结果
		StringBuilder sb = new StringBuilder();
		
		while (position < text.length()){
			char c = text.charAt(position);
			// 跳过符号
			if(isSymbol(c)){
				// 若指针1处于根节点,将此符号计入结果,让指针2向下走一步
				if(tempNode == rootNode){
					sb.appenf(c);
					begin++;
				}
				// 无论符号在开头或中间,指针3都向下走一步
				position++;
				continue;
			}
			
			// 检查下级节点
			tempNode = tempNode.getSubNode(c);
			if(tempNode == null){
				// 以begin开头的字符串不是敏感词
				sb.apped(text.charAt(begin));
				// 进入下一个位置
				position = ++begin;
				// 重新指向根节点
				tempNode = rootNode;
			} else if(tempNode.isKeywordEnd()){
			 	// 发现敏感词,将begin~position字符串替换掉
			 	sb.append(REPLACEMENT);
			 	// 进入下一个位置
			 	begin = ++position;
			}else {
				// 检查下一个字符
				position++;
			}
		}
		// 将最后一批字符计入结果
		sb.append(text.substring(begin));

		return sb.toString();
	}
	
	// 判断是否为符号
	private boolean isSymbol(Character c){
		// 0x2E80 ~ 0x9FFF 是东亚文字范围
		return !Charutils.isAsciiAlphanumeric(c) && (c < 0x2E80 || c > 0x9FFF);
	}
	
	// 前缀树
	private class TrieNode{
		
		// 关键词结束标识
		privte boolean isKeywordEnd = false;
		
		// 子节点(key是下级字符,value是下级节点)
		private Map<Character,TrieNode> subNodes = new HashMap<>();
		
		// get和set方法
		public boolean isKeywordEnd(){
			return isKeywordEnd;
		}
		
		public void setKeywordEnd(boolean keywordEnd){
			isKeywordEnd = keywordEnd;
		}
		
		// 添加子节点
		public void addSubNode(Character c,TrieNode node){
			subNodes.put(c,node);
		}

		// 获取子节点
		public TrieNode getSubNode(Character c){
			return subNodes.get(c);
		}
    }
}

三,创建Sensitive,进行调用

js 复制代码
public class Sensitive {
	@Autowired
	private SensitiveFilter sensitiveFilter;
	
	@Override
	public void SensitiverFilter(String name){
		filter = sensitiveFilter.filter(name);
		System.out.println(filter)
	}
}
相关推荐
careathers3 小时前
【数据结构】基于比较的排序算法 - 插入排序
java·数据结构·排序算法
RuoyiOffice3 小时前
UniApp企业办公:把审批、客户和项目装进手机,能做些什么?
spring boot·vue3·uniapp·crm·flowable·移动办公·企业应用
打工仔折腾 AI3 小时前
后端部署避坑:吃透IPv4地址、网络接口与CIDR前缀的实际应用
arm开发·人工智能·后端·python·性能优化
街头便衣3 小时前
OpenRouter周榜复算:164万亿token,输出2.55%,DeepSeek账单占1.4%
android·java·开发语言·人工智能·语言模型·开源
mister_guo3 小时前
Spring Boot 配置文件读取的几种方式:用法、原理与常见误区
java·spring boot
余槐i3 小时前
虚拟线程上线后吞吐反而掉了:Spring Boot 3 里 synchronized 锁住载体线程的定位与修复
java·spring boot·性能优化·虚拟线程·jdk 21
要开心吖ZSH3 小时前
DDD(领域驱动设计)篇三:实战对照——同一个订单业务,两种架构怎么写
java·架构·领域模型·ddd·领域驱动设计·设计思想
独泪了无痕11 小时前
Spring Data Redis 快速上手
spring boot·redis·后端
wangchunyu11413 小时前
JAVA CompletableFuture异步编程实战
java·开发语言·python
paopaokaka_luck14 小时前
流浪动物救助与收养系统(DeepSeek AI对话、 ECharts多维分析、救助流程衔接、领养与回访衔接、 捐赠确认与公示、志愿者协作)
java·前端·javascript·人工智能·mysql·echarts·推荐算法