本文的敏感词过滤器用在SpringBoot项目中,因此,首先需要在pom.xml文件中导入如下依赖
org.springframework.boot spring-boot-starter-aop org.springframework.boot spring-boot-starter-thymeleaf org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-devtools runtime org.springframework.boot spring-boot-starter-test test org.apache.commons commons-lang3 3.9
在resources目录下,创建sensitive-word.txt,里面填入需要过滤的敏感词信息。
前缀树TrieNode以一个空节点为头结点,每个节点下包含若干子节点,不同节点代表不同字符。TrieNode 由两部分组成,首先是一个boolean变量,表示该结点是否为一个关键词的终结点。其次是该结点的子节点集合,在本文中,用HashMap存储子节点,key存储结点代表的字符,类型为Character,value为TrieNode,表示子节点。实现的代码如下。
//前缀树 private class TrieNode{ //关键词结束标识 private boolean isKeywordEnd = false; //子节点 private MapsubNodes = new HashMap<>(); //isKeywordEnd的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); } }
@Component public class SensitiveFilter { // 替换符 private static final String REPLACEMENT = "***"; //根节点 private TrieNode rootNode = new TrieNode(); //bean的初始化方法,服务一启动,容器自动给bean执行此方法完成初始化 //此方法的目的是读取敏感词文件,构建敏感词前缀树 @PostConstruct public void init(){ try( InputStream is = this.getClass().getClassLoader().getResourceAsStream("sensitive-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; i0x9FFF); } }
到此这篇关于Java实战之敏感词过滤器的文章就介绍到这了,更多相关Java敏感词过滤器内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!