文档章节

JAVA 敏感词过滤

战地春梦
 战地春梦
发布于 2015/07/18 10:26
字数 863
阅读 148
收藏 4

在网站中进行敏感词过滤是非常必要的。

先写一个过滤器

public class WordValidator implements Filter{

private WordValidatorUtil wordValidatorUtil=new WordValidatorUtil(); 

@Override

public void destroy() {

wordValidatorUtil=null;

}

@Override

public void doFilter(ServletRequest arg0, ServletResponse arg1,

FilterChain arg2) throws IOException, ServletException {



HttpServletRequest request= (HttpServletRequest) arg0;

HttpServletResponse response = (HttpServletResponse) arg1;



String txt=request.getParameter("txt");

if(txt!=null)

{

Boolean bool = wordValidatorUtil.isContaintSensitiveWord(txt, 1);

if(bool==true){

System.out.println("有敏感词");

PrintWriter writer=response.getWriter();

writer.print(common.util.Status.SENSITIVE_WORD_TRUE);

writer.flush();

writer.close();

}else {

System.out.println("没有敏感词");

arg2.doFilter(arg0, arg1);

}

}else {

arg2.doFilter(arg0, arg1);

}

return;

}

@Override

public void init(FilterConfig arg0) throws ServletException {

}

}



//WordValidatorUtil 类 判断输入是否包含关键字

public class WordValidatorUtil {



private Map sensitiveWordMap = null;

public static int minMatchTYpe = 1;      //最小匹配规则

public static int maxMatchType = 2;      //最大匹配规则



/**

* 构造函数,初始化敏感词库

*/

public WordValidatorUtil(){

WordValidatorInit wordValidatorInit=new WordValidatorInit();

sensitiveWordMap=wordValidatorInit.initKeyWord();

}



/**

* 判断文字是否包含敏感字符

* @param txt  文字

* @param matchType  匹配规则 1:最小匹配规则,2:最大匹配规则

* @return 若包含返回true,否则返回false

* @version 1.0

*/

public boolean isContaintSensitiveWord(String txt,int matchType){

boolean flag = false;

for(int i = 0 ; i < txt.length() ; i++){

int matchFlag = this.CheckSensitiveWord(txt, i, matchType); //判断是否包含敏感字符

if(matchFlag > 0){    //大于0存在,返回true

flag = true;

}

}

return flag;

}



/**

* 检查文字中是否包含敏感字符,检查规则如下:<br>

* @author chenming 

* @param beginIndex

* @param matchType

* @return,如果存在,则返回敏感词字符的长度,不存在返回0

*/

public int CheckSensitiveWord(String txt,int beginIndex,int matchType){

boolean  flag = false;    //敏感词结束标识位:用于敏感词只有1位的情况

int matchFlag = 0;     //匹配标识数默认为0

char word = 0;

Map nowMap = sensitiveWordMap;

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(WordValidatorUtil.minMatchTYpe == matchType){    //最小规则,直接返回,最大规则还需继续查找

break;

}

}

}

else{     //不存在,直接返回

break;

}

}

if(matchFlag < 2 || !flag){        //长度必须大于等于1,为词 

matchFlag = 0;

}

return matchFlag;

}

}



//敏感词库初始化

public class WordValidatorInit {



private String ENCODING = "UTF-8";    //字符编码

public HashMap sensitiveWordMap;



/**

* 

* @version 1.0

*/

public Map initKeyWord(){

try {

//读取敏感词库

Set<String> keyWordSet = readSensitiveWordFile();

//将敏感词库加入到HashMap中

addSensitiveWordToHashMap(keyWordSet);

//spring获取application,然后application.setAttribute("sensitiveWordMap",sensitiveWordMap);

} catch (Exception e) {

e.printStackTrace();

}

return sensitiveWordMap;

}



/**

* @param keyWordSet  敏感词库

* @version 1.0

*/

private void addSensitiveWordToHashMap(Set<String> keyWordSet) {

sensitiveWordMap = new HashMap(keyWordSet.size());     //初始化敏感词容器,减少扩容操作

String key = null;  

Map nowMap = null;

Map<String, String> newWorMap = null;

//迭代keyWordSet

Iterator<String> 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<String,String>();

newWorMap.put("isEnd", "0");     //不是最后一个

nowMap.put(keyChar, newWorMap);

nowMap = newWorMap;

}



if(i == key.length() - 1){

nowMap.put("isEnd", "1");    //最后一个

}

}

}

}



/**

* 读取敏感词库中的内容,将内容添加到set集合中

* @return

* @version 1.0

* @throws Exception 

*/



private Set<String> readSensitiveWordFile() throws Exception{

Set<String> set = null;



File file = new File(getClass().getClassLoader().getResource("SensitiveWord.txt").getPath());    //读取文件

InputStreamReader read = new InputStreamReader(new FileInputStream(file),ENCODING);

try {

if(file.isFile() && file.exists()){      //文件流是否存在

set = new HashSet<String>();

BufferedReader bufferedReader = new BufferedReader(read);

String txt = null;

while((txt = bufferedReader.readLine()) != null){    //读取文件,将文件内容放入到set中

set.add(txt);

   }

}

else{         //不存在抛出异常信息

throw new Exception("敏感词库文件不存在");

}

} catch (Exception e) {

throw e;

}finally{

read.close();     //关闭文件流

}

return set;

}

}

 

© 著作权归作者所有

上一篇: Map.Entry用法
下一篇: Java 反射 class类
战地春梦
粉丝 5
博文 33
码字总数 24598
作品 0
南充
私信 提问
有个问题请教红薯老大下

老大,最近有个项目对 信息内容 的控制比较严格,对一些敏感词要进行过滤, 我有个模糊的印象 在论坛里看到过该类问题的贴子,找不到了,希望老大能分享下 敏感词过滤的实现思路(Java),或...

慢慢爬
2011/03/04
153
2
java+html实现弹幕功能并集成敏感词过滤功能,实现思路

即时评论和即时弹幕功能架构设计: 后端数据存储 前端弹幕展示方式 前后台即时通讯方式 敏感词过滤系统 数据存储 弹幕数据庞大,一般是无用数据,存储的话纯文本就行,结构化要求不强,数据不...

两毛五哥哥
2017/11/16
0
0
评价系统

需求描述: 工作类型: Web应用开发 技能要求: Java;Java开发 预计完成时间: 2016-07-31 驻场要求: 需定期到[广东省-广州市]驻场 要求提供发票: 增值税专用发票 详细需求: 1) 现状 a) 目...

13078878620
2016/05/18
6
0
Nextalk专业社区网站即时通讯系统,5.7版本正式发布。

NexTalk简单专业、开放源码的网站即时消息系统 NexTalk是专为网站设计的简单专业,开放源码的即时消息系统。可快速为社区网站、电子商务网站、企业网站提供即时消息服务。 NexTalk可为电子商...

lee8913151
2014/10/16
8
0
关于静态代码分析PMD如何实现对java项目进行非法连接和敏感词过滤

如何编写一个PMD规则去实现对一个java项目是否包含有非法连接或敏感词?

Joker-Face
2018/08/07
65
0

没有更多内容

加载失败,请刷新页面

加载更多

spring 本类中方法调用另外一个方法事务不生效

1、在spring配置文件中添加 <aop:aspectj-autoproxy expose-proxy="true"/> 声明自动代理 2、AopContext.currentProxy()来获取代理类 3、使用代理类proxy进行代理调用内部声明了事务的方法 ......

重城重楼
15分钟前
2
0
项目 banner 乱弹

------------------------------------------ 村上春树 ------------------------------------- 如果我爱你,而你也正巧爱我,你头发乱了的时候,我会笑笑地替你拨一拨,然后手还留恋地在你...

宿小帅
27分钟前
1
0
PHP获取未来七天的日期和星期

php获取未来七天的日期和星期代码 第一步:获取需要天数的日期,然后调用函数 //获取未来七天的日期 for($i=1;$i<8;$i++){ $dateArray[$i]=date('Y-m-d',strtotime(d...

一只懒猫-
38分钟前
0
0
总结:IO模型

分类 多路复用 参考文章: https://www.jianshu.com/p/6a6845464770 https://www.cnblogs.com/zingp/p/6863170.html https://blog.csdn.net/sehanlingfeng/article/details/78920423......

浮躁的码农
41分钟前
0
0
fabric-sdk-java 1.4安装说明

Hyperledger Fabric Java SDK是开发基于Hyperledger Fabric区块链的Java应用之必备开发包。本文将介绍如何在Maven、Gradle和Eclipse中安装使用最新1.4版本的Hyperledger Fabric Java SDK。 ...

汇智网教程
42分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部