ssm实现敏感词过滤
首先引入工具类:SensitiveWordsUtil
该工具类采用DFA算法,速度还是蛮快的,比我手写的快多了。
package com.kz.utils;import java.io.IOException;
import java.util.*;public class SensitiveWordsUtil {/*** 最小匹配规则,如:敏感词库["中国","中国人"],语句:"我是中国人",匹配结果:我是[中国]人*/public static final int MinMatchTYpe = 1;/*** 最大匹配规则,如:敏感词库["中国","中国人"],语句:"我是中国人",匹配结果:我是[中国人]*/public static final int MaxMatchType = 2;/*** 敏感词集合*/public static HashMap sensitiveWordMap;/*** 初始化敏感词库,构建DFA算法模型** @param sensitiveWordSet 敏感词库*/public static synchronized void init(Set<String> sensitiveWordSet) {initSensitiveWordMap(sensitiveWordSet);}/*** 初始化敏感词库,构建DFA算法模型** @param sensitiveWordSet 敏感词库*/private static void initSensitiveWordMap(Set<String> sensitiveWordSet) {//初始化敏感词容器,减少扩容操作sensitiveWordMap = new HashMap(sensitiveWordSet.size());String key;Map nowMap;Map<String, String> newWorMap;//迭代sensitiveWordSetIterator<String> iterator = sensitiveWordSet.iterator();while (iterator.hasNext()) {//关键字key = iterator.next();nowMap = sensitiveWordMap;for (int i = 0; i < key.length(); i++) {//转换成char型char keyChar = key.charAt(i);//库中获取关键字Object wordMap = nowMap.get(keyChar);//如果存在该key,直接赋值,用于下一个循环获取if (wordMap != null) {nowMap = (Map) wordMap;} else {//不存在则,则构建一个map,同时将isEnd设置为0,因为他不是最后一个newWorMap = new HashMap<>();//不是最后一个newWorMap.put("isEnd", "0");nowMap.put(keyChar, newWorMap);nowMap = newWorMap;}if (i == key.length() - 1) {//最后一个nowMap.put("isEnd", "1");}}}}/*** 判断文字是否包含敏感字符** @param txt 文字* @param matchType 匹配规则 1:最小匹配规则,2:最大匹配规则* @return 若包含返回true,否则返回false*/public static boolean contains(String txt, int matchType) {boolean flag = false;for (int i = 0; i < txt.length(); i++) {//判断是否包含敏感字符int matchFlag = checkSensitiveWord(txt, i, matchType);//大于0存在,返回trueif (matchFlag > 0) {flag = true;}}return flag;}/*** 判断文字是否包含敏感字符** @param txt 文字* @return 若包含返回true,否则返回false*/public static boolean contains(String txt) {return contains(txt, MaxMatchType);}/*** 获取文字中的敏感词** @param txt 文字* @param matchType 匹配规则 1:最小匹配规则,2:最大匹配规则* @return*/public static Set<String> getSensitiveWord(String txt, int matchType) {Set<String> sensitiveWordList = new HashSet<>();for (int i = 0; i < txt.length(); i++) {//判断是否包含敏感字符int length = checkSensitiveWord(txt, i, matchType);//存在,加入list中if (length > 0) {sensitiveWordList.add(txt.substring(i, i + length));//减1的原因,是因为for会自增i = i + length - 1;}}return sensitiveWordList;}/*** 获取文字中的敏感词** @param txt 文字* @return*/public static Set<String> getSensitiveWord(String txt) {return getSensitiveWord(txt, MaxMatchType);}/*** 替换敏感字字符** @param txt 文本* @param replaceChar 替换的字符,匹配的敏感词以字符逐个替换,如 语句:我爱中国人 敏感词:中国人,替换字符:*, 替换结果:我爱**** @param matchType 敏感词匹配规则* @return*/public static String replaceSensitiveWord(String txt, char replaceChar, int matchType) {String resultTxt = txt;//获取所有的敏感词Set<String> set = getSensitiveWord(txt, matchType);Iterator<String> iterator = set.iterator();String word;String replaceString;while (iterator.hasNext()) {word = iterator.next();replaceString = getReplaceChars(replaceChar, word.length());resultTxt = resultTxt.replaceAll(word, replaceString);}return resultTxt;}/*** 替换敏感字字符** @param txt 文本* @param replaceChar 替换的字符,匹配的敏感词以字符逐个替换,如 语句:我爱中国人 敏感词:中国人,替换字符:*, 替换结果:我爱**** @return*/public static String replaceSensitiveWord(String txt, char replaceChar) {return replaceSensitiveWord(txt, replaceChar, MaxMatchType);}/*** 替换敏感字字符** @param txt 文本* @param replaceStr 替换的字符串,匹配的敏感词以字符逐个替换,如 语句:我爱中国人 敏感词:中国人,替换字符串:[屏蔽],替换结果:我爱[屏蔽]* @param matchType 敏感词匹配规则* @return*/public static String replaceSensitiveWord(String txt, String replaceStr, int matchType) {String resultTxt = txt;//获取所有的敏感词Set<String> set = getSensitiveWord(txt, matchType);Iterator<String> iterator = set.iterator();String word;while (iterator.hasNext()) {word = iterator.next();resultTxt = resultTxt.replaceAll(word, replaceStr);}return resultTxt;}/*** 替换敏感字字符** @param txt 文本* @param replaceStr 替换的字符串,匹配的敏感词以字符逐个替换,如 语句:我爱中国人 敏感词:中国人,替换字符串:[屏蔽],替换结果:我爱[屏蔽]* @return*/public static String replaceSensitiveWord(String txt, String replaceStr) {return replaceSensitiveWord(txt, replaceStr, MaxMatchType);}/*** 获取替换字符串** @param replaceChar* @param length* @return*/private static String getReplaceChars(char replaceChar, int length) {String resultReplace = String.valueOf(replaceChar);for (int i = 1; i < length; i++) {resultReplace += replaceChar;}return resultReplace;}/*** 检查文字中是否包含敏感字符,检查规则如下:** @param txt* @param beginIndex* @param matchType* @return 如果存在,则返回敏感词字符的长度,不存在返回0*/private static int checkSensitiveWord(String txt, int beginIndex, int matchType) {//敏感词结束标识位:用于敏感词只有1位的情况boolean flag = false;//匹配标识数默认为0int matchFlag = 0;char word;Map nowMap = sensitiveWordMap;for (int i = beginIndex; i < txt.length(); i++) {word = txt.charAt(i);//获取指定keynowMap = (Map) nowMap.get(word);//存在,则判断是否为最后一个if (nowMap != null) {//找到相应key,匹配标识+1matchFlag++;//如果为最后一个匹配规则,结束循环,返回匹配标识数if ("1".equals(nowMap.get("isEnd"))) {//结束标志位为trueflag = true;//最小规则,直接返回,最大规则还需继续查找if (MinMatchTYpe == matchType) {break;}}} else {//不存在,直接返回break;}}//长度必须大于等于1,为词if (matchFlag < 2 || !flag) {matchFlag = 0;}return matchFlag;}/*** 敏感词替换工具方法(对外方法)** @param string* @return* @exception IOException 读写文件异常*/public static String sensitiveHelper(String string, Set<String> sensitiveWords) throws IOException {//初始化敏感词库SensitiveWordsUtil.init(sensitiveWords);//判断是否包含敏感词库if (contains(string)){//若包含返回替换后的字符String str = SensitiveWordsUtil.replaceSensitiveWord(string, "**");return str;}//不包含返回原本字符return string;}}
jsp代码
<script>//敏感词过滤$("#seachButton").on("click", function () {var search = $.trim($("#search").val());if (search != "" || search.length != 0) {console.log(search);$.ajax({url:"${path}/home/validateContent",data:{"content":search},success:function (data) {if (data.result != "allow"){alert("输入框中包含敏感词汇:" + data.sensWords);$("#search").val(data.result);} else {location.href='${path}/searchInfo?search='+search;}}})}})
</script>
控制器代码:KeywordController
package com.kz.controller;import com.kz.service.KeywordService;
import com.kz.utils.SensitiveWordsUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;@Controller
public class KeywordController {@Autowiredprivate KeywordService service;@RequestMapping({"register/validateContent", "login/validateContent","home/validateContent"})@ResponseBodypublic Map validateContent(HttpServletRequest request) {Map<Object, Object> map = new HashMap();String content = request.getParameter("content").trim();Set<String> keywords = service.selectAll();if (keywords.size() != 0) {SensitiveWordsUtil.init(keywords);boolean flag = SensitiveWordsUtil.contains(content);if (flag) {String replaceContent = SensitiveWordsUtil.replaceSensitiveWord(content, "**");Set<String> sensWords = SensitiveWordsUtil.getSensitiveWord(content);map.put("result", replaceContent);map.put("sensWords", sensWords);} else {map.put("result", "allow");}return map;}return map;}
}
目前只能对单一指定的url进行过滤,这样如果输入框比较多,就比较麻烦。
需求是要对所有输入框进行敏感词过滤,本来是想采用filter过滤器的,但是发现无法注入service,网上找了解决办法,但是最终好像没有过滤所有的url,即使使用了注解@WebFilter(value="/*"),自己在慢慢探索吧。
ssm实现敏感词过滤相关推荐
- 字符串匹配算法 -- AC自动机 基于Trie树的高效的敏感词过滤算法
文章目录 1. 算法背景 2. AC自动机实现原理 2.1 构建失败指针 2.2 依赖失败指针过滤敏感词 3. 复杂度及完整代码 1. 算法背景 之前介绍过单模式串匹配的高效算法:BM和KMP 以及 ...
- php敏感字符串过滤_PHP实现的敏感词过滤方法示例
本文实例讲述了PHP实现的敏感词过滤方法.分享给大家供大家参考,具体如下: 1.敏感词过滤方法 /** * @todo 敏感词过滤,返回结果 * @param array $list 定义敏感词一维数 ...
- 5分钟Serverless实践 | 构建无服务器的敏感词过滤后端系统
前言 在上一篇"5分钟Serverless实践"系列文章中,我们介绍了什么是Serverless,以及如何构建一个无服务器的图片鉴黄Web应用,本文将延续这个话题,以敏感词过滤为例 ...
- 敏感词过滤,PHP实现的Trie树
[转载]敏感词过滤,PHP实现的Trie树 原文地址:http://blog.11034.org/2012-07/trie_in_php.html 项目需求,要做敏感词过滤,对于敏感词本身就是一个CR ...
- Java实现敏感词过滤 - IKAnalyzer中文分词工具
IKAnalyzer 是一个开源的,基于java语言开发的轻量级的中文分词工具包. 官网: https://code.google.com/archive/p/ik-analyzer/ 本用例借助 I ...
- python中哪些词是敏感字词_python实现敏感词过滤的几种方法
1.replace过滤 最简单也是最直接的就是直接循环敏感词,然后使用replace过滤关键词,文章和敏感词少的时候还可以,多的时候效率就真的很一般了. 2.使用正则过滤 有两个技术要点, 1.使用P ...
- python骂人的程序_Python实现敏感词过滤的4种方法
在我们生活中的一些场合经常会有一些不该出现的敏感词,我们通常会使用*去屏蔽它,例如:尼玛 -> **,一些骂人的敏感词和一些政治敏感词都不应该出现在一些公共场合中,这个时候我们就需要一定的手段去 ...
- 敏感词过滤的php代码,php实现敏感词过滤(Trie树)
灵感来自于 [嘉兴ing](https://segmentfault.com/a/1190000019137933 "Trie树 php 实现敏感词过滤") 感谢分享. 本文主要是 ...
- python敏感词过滤代码简单_大型企业都在用,Python实现敏感词过滤
在我们生活中的一些场合经常会有一些不该出现的敏感词,我们通常会使用*去屏蔽它,例如:尼玛 -> **,一些骂人的敏感词和一些政治敏感词都不应该出现在一些公共场合中,这个时候我们就需要一定的手段去 ...
最新文章
- Fatal Error: Out of memory php内存溢出处理三种方法
- 草图检索和识别[开源]
- 激光IMU融合——LIO-Mapping / LIOM / LINS / LIO-SAM算法解析
- 逆水寒最新的服务器7月12日,《逆水寒》7月12日更新内容一览
- 行程编码(atoi函数)
- (19)FPGA面试题设计前端流程
- 对多个有规律表进行更新剔重复操作的存储过程(up8000)
- 浙大 PAT b1017
- \r,\n,\r\n的问题分析
- HTML简易自适应布局
- 苏强SN系列服务器说明书,SN2000交流伺服驱动器使用手册.pdf
- 简单聊聊Long Short Term Memory Network (LSTM)和 Gated Recurrent Unit (GRU)两种强大的RNN变体
- 【算法思想】数学归纳法在算法题中的应用(含例题举例)
- SDL_Image,d3d9与OpenGL Shader混用方法(一)
- pyinstxtractor.py 的改进 - 反编译pyinstaller生成exe的工具
- Linux手机众筹1000万
- JAVA IO与NIO优劣浅析
- flask----继承和bock
- 虚拟机安装ros时候出现“The directory ‘/home/xxx/.cache/pip‘...”的问题解决方法(亲测有用)
- php 中文转拼音 开头大写(附中文转首字母大写/全拼小写)