packagecom.test.util;importjava.io.BufferedReader;importjava.io.File;importjava.io.FileInputStream;importjava.io.IOException;importjava.io.InputStreamReader;importjava.util.HashMap;importjava.util.HashSet;importjava.util.Iterator;importjava.util.Map;importjava.util.Set;importorg.springframework.stereotype.Component;/*** Utils - 敏感词
*
*@authortest
*@version3.0*/@Componentpublic classDirtyStringUtil {private static String ENCODING = "UTF-8"; //字符编码
private static String PATH = "/resources/shop/dirtyString/DirtyString.txt"; //你的敏感词汇的文件 我会给大家分享一个我们用的
public static int minMatchTYpe = 1; //最小匹配规则
public static int maxMatchType = 2; //最大匹配规则
@SuppressWarnings("rawtypes")public staticHashMap sensitiveWordMap;static{try{
sensitiveWordMap= addSensitiveWordToHashMap(StringUtils.sourFolder+PATH);
}catch(Exception e) {
}
}/*** 读取敏感词库,将敏感词放入HashSet中,构建一个DFA算法模型:
* 中 = {
* isEnd = 0
* 国 = {
* isEnd = 1
* 人 = {isEnd = 0
* 民 = {isEnd = 1}
* }
* 男 = {
* isEnd = 0
* 人 = {
* isEnd = 1
* }
* }
* }
* }
* 五 = {
* isEnd = 0
* 星 = {
* isEnd = 0
* 红 = {
* isEnd = 0
* 旗 = {
* isEnd = 1
* }
* }
* }
* }
* @date 2014年4月20日 下午3:04:20
*@paramkeyWordSet 敏感词库
*@version1.0*/@SuppressWarnings({"rawtypes", "unchecked"})private staticHashMap addSensitiveWordToHashMap(String path) {
Set keyWordSet = null;
File file= new File(path); //读取文件
InputStreamReader read = null;try{
read= new InputStreamReader(newFileInputStream(file),ENCODING);if(file.isFile() && file.exists()){ //文件流是否存在
keyWordSet = new HashSet();
@SuppressWarnings("resource")
BufferedReader bufferedReader= newBufferedReader(read);
String txt= null;while((txt = bufferedReader.readLine()) != null){ //读取文件,将文件内容放入到set中
keyWordSet.add(txt);
}
}else{ //不存在抛出异常信息
throw new Exception("敏感词库文件不存在");
}
}catch(Exception e) {
e.printStackTrace();
}finally{try { //关闭文件流
if (read != null) {
read.close();
}
}catch(IOException e) {
e.printStackTrace();
}
}
HashMap sensitiveWordMap= new HashMap(keyWordSet.size()); //初始化敏感词容器,减少扩容操作
String key = null;
Map nowMap= null;
Map newWorMap = null;//迭代keyWordSet
Iterator iterator =keyWordSet.iterator();while(iterator.hasNext()){
key= iterator.next(); //关键字
nowMap =sensitiveWordMap;for(int i = 0 ; i < key.length() ; i++){char keyChar = key.charAt(i); //转换成char型
Object wordMap = nowMap.get(keyChar); //获取
if(wordMap != null){ //如果存在该key,直接赋值
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"); //最后一个
}
}
}returnsensitiveWordMap;
}/*** 检查文字中是否包含敏感字符,检查规则如下:
* @date 2014年4月20日 下午4:31:03
*@paramtxt
*@parambeginIndex
*@parammatchType
*@return,如果存在,则返回敏感词字符的长度,不存在返回0
*@version1.0*/@SuppressWarnings({"rawtypes"})public static int CheckSensitiveWord(String txt, Map nowMap, int beginIndex,intmatchType){boolean flag = false; //敏感词结束标识位:用于敏感词只有1位的情况
int matchFlag = 0; //匹配标识数默认为0
char word = 0;for(int i = beginIndex; i < txt.length() ; i++){
word=txt.charAt(i);
nowMap= (Map) nowMap.get(word); //获取指定key
if(nowMap != null){ //存在,则判断是否为最后一个
matchFlag++; //找到相应key,匹配标识+1
if("1".equals(nowMap.get("isEnd"))){ //如果为最后一个匹配规则,结束循环,返回匹配标识数
flag = true; //结束标志位为true
if(minMatchTYpe == matchType){ //最小规则,直接返回,最大规则还需继续查找
break;
}
}
}else{ //不存在,直接返回
break;
}
}if(matchFlag < 2 || !flag){ //长度必须大于等于1,为词
matchFlag = 0;
}returnmatchFlag;
}/*** 判断文字是否包含敏感字符
* @date 2014年4月20日 下午4:28:30
*@parampath 敏感词库文件路径
*@paramtxt 文字
*@parammatchType 匹配规则 1:最小匹配规则,2:最大匹配规则
*@return若包含返回true,否则返回false
*@version1.0*/
public static boolean isContaintSensitiveWord(String txt, intmatchType){boolean flag = false;for(int i = 0 ; i < txt.length() ; i++){int matchFlag = CheckSensitiveWord(txt, sensitiveWordMap, i, matchType); //判断是否包含敏感字符
if(matchFlag > 0){ //大于0存在,返回true
flag = true;
}
}returnflag;
}
}