敏感词过滤器的实现

敏感词过滤器的实现敏感词过滤器的实现导包敏感词文件前缀树的实现敏感词过滤器的实现导包本文的敏感词过滤器用在SpringBoot项目中,因此,首先需要在pom.xml文件中导入如下依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId></dependency><depend

大家好,又见面了,我是你们的朋友全栈君。

导包

本文的敏感词过滤器用在SpringBoot项目中,因此,首先需要在pom.xml文件中导入如下依赖

<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-devtools</artifactId>
		<scope>runtime</scope>
</dependency>

<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
</dependency>

<dependency>
		<groupId>org.apache.commons</groupId>
		<artifactId>commons-lang3</artifactId>
		<version>3.9</version>
</dependency>

敏感词文件

在resources目录下,创建sensitive-word.txt,里面填入需要过滤的敏感词信息。
在这里插入图片描述
在这里插入图片描述

前缀树的实现

前缀树TrieNode以一个空节点为头结点,每个节点下包含若干子节点,不同节点代表不同字符。TrieNode 由两部分组成,首先是一个boolean变量,表示该结点是否为一个关键词的终结点。其次是该结点的子节点集合,在本文中,用HashMap存储子节点,key存储结点代表的字符,类型为Character,value为TrieNode,表示子节点。实现的代码如下。

    //前缀树
    private class TrieNode{ 
   
        //关键词结束标识
        private boolean isKeywordEnd = false;

        //子节点
        private Map<Character,TrieNode> subNodes = 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; 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.append(c);
begin++;
}
//无论符号在开头还是敏感词中间,指针3都向下走一步
position++;
continue;
}
//检查下级节点
tempNode = tempNode.getSubNode(c);
if(tempNode==null){ 

//以begin开头的的字符串不是敏感词
sb.append(text.charAt(begin));
//指针2和指针3共同指向指针2的下一个位置
position = ++begin;
//指针1重新指向根节点
tempNode = rootNode;
}else if(tempNode.isKeywordEnd()){ 

//发现敏感词,将begin~position字符串替换
sb.append(REPLACEMENT);
//进入下一个位置
begin = ++position;
//指针1重新指向根节点
tempNode = rootNode;
}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);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/132243.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 解决docker下载镜像速度过慢_docker image是什么

    解决docker下载镜像速度过慢_docker image是什么前言上一篇讲到pull镜像,但是pull镜像的时候下拉的速度实在感人,有什么解决办法吗?我们只需将docker镜像源修改为国内的将docker镜像源修改为国内的:在/etc/docker/d

  • 配对t检验的应用条件是什么_配对t检验在实际工作中的应用[通俗易懂]

    配对t检验的应用条件是什么_配对t检验在实际工作中的应用[通俗易懂](r:相关系数)双样本t时用此公式计算标准误:→三、成组t检验:适用于完全随机设计的两均值比较,要求个体之间相互独立,两组资料均服从正态分布且方差齐性,即为标准的双样本t检验。四、我们重点来看一下,配对t检验,配对t检验从设计上分为3种情况,如下:1、自身配对设计:选择K个受试者,分别在甲、乙两个不同的试验条件(即某个因素的两个水平)下,测出每个受试者同一个指标的两个数值,并把它们配成一对。2、同…

  • 最新版黑苹果MacOS 10.14 Mojave安装教程

    最新版黑苹果MacOS 10.14 Mojave安装教程安装分为三部分:1.制作安装U盘2.安装MacOS系统3.安装clover(四叶草)用到的安装工具(按用到的先后顺序):1.Clover_v2.4k_r4679.pkg2.CloverConfigurator.zip3.一般台式机都能使用的通用EFI下载链接:https://pan.baidu.com/s/1sk6tYbCZ0riy0I6…

  • ER图(实体-联系图)「建议收藏」

    ER图(实体-联系图)「建议收藏」概念E-R图也称实体-联系图(EntityRelationshipDiagram),提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型。构成ER图有实体(entity)、属性(attribute)、关系(relationship)三部分。用“矩形框”表示实体型,矩形框内写明实体名称;用“椭圆框”表示实体的属性,将属性名记入框中;用”菱形框“表示实体型之间的关系,在菱形…

  • 正在接入或无法接入认证服务器(服务器未运行怎么解决)

    迷你版云服务器未启动内容精选换一换企业主机安全(HostSecurityService,HSS)是提升服务器整体安全性的服务,通过主机管理、风险防御、入侵检测、安全运营、网页防篡改功能,可全面识别并管理云服务器中的信息资产,实时监测云服务器中的风险,降低服务器被入侵的风险。使用主机安全需要在云服务器中安装Agent。安装Agent后,您的云服务器将受到HSS云端防护中企业主机安全(Host…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号