很多小伙伴在做网站的时候可能会遇到一些敏感词汇不能出现在网站,但是又不能控制用户的输入,所以贴出一个关键字过滤功以解忧愁

1、前端使用ajax提交表单,将要过滤的字段提交到后台过滤

function audit(obj){//保存并过滤关键字
    var a = obj;
    document.getElementById("checked").value = a;
    $.ajax({//将内容提交到后台过滤关键字
       type:"POST",
       dataType:"JSON",
       url:"cmsContentFiltration/filtration.do",//过滤接口我的是这样的
       data:$('#form').serialize(),//将表单序列化提交后台过滤关键字
       success:function(str){//回调函数中进行是否保存操作
       if(str.data==""|| str.data===undefined){//无敏感词汇直接保存
                $("#form").submit()
       }else{
      if(window.confirm('所提交的内容包含:'+str.data+'等以下敏感词汇,是否保存?')){
                $("#form").submit();
                return true;
              }else{
               return false;
             }
        }
      }
   });
}

2、控制层

/*** @ClassName filtration* @Description* @Author shenWB* @Date 2019/6/27 10:12* @Version 1.0**/@RequestMapping("filtration")@ResponseBodypublic Object filtration(CmsContent entity, CmsContentAttribute attribute, @ModelAttribute CmsContentParamters contentParamters,Boolean draft, Boolean checked, HttpServletRequest request, HttpSession session, ModelMap model){Map<String, Object> m = new HashMap<String, Object>();List<String> str =new ArrayList<String>();//要过滤字段的集合str.add(entity.getTitle());//标题//if (!attribute.getText().equals(null)) {if (attribute != null && attribute.getText() != null && !attribute.getText().isEmpty()) {str.add(attribute.getText());//正文}//if (!entity.getEditor().equals(null)) {if (entity != null && entity.getEditor()!=null && !entity.getEditor().isEmpty()) {str.add(entity.getEditor());//编辑}//if (!entity.getDescription().equals(null)) {if (entity != null && entity.getDescription() != null && !entity.getDescription().isEmpty()) {str.add(entity.getDescription());//描述}if(contentParamters.getCategoryExtendDataList()!=null){for (ExtendData obj : contentParamters.getCategoryExtendDataList()) {//扩展字段str.add(obj.getValue());}}SensitivewordFilter filter = new SensitivewordFilter();//过滤词工具类对象String sb="";//拼接字符串,用于前台提示用户具体包含哪些关键字,for (String string : str) {//要过滤字段的集合,取出逐一过滤Set<String> set = filter.getSensitiveWord(string, 1);//要过滤的字段传到工具类中去过滤if(!set.toString().equals("[]")){sb+=set+",";}}if(!sb.equals("")){sb = sb.substring(0,sb.length()-1);//去掉最后多出来的逗号。}m.put("data", sb);    return m;}

3、关键字过滤工具类1

package com.publiccms.common.tools;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/**

* @Author shenWB

* @Date 2019/6/27 15:12

* @Version 1.0

**/
public class SensitivewordFilter {
    @SuppressWarnings("rawtypes")
    private Map sensitiveWordMap = null;
    public static int minMatchTYpe = 1;      //最小匹配规则
    public static int maxMatchType = 2;      //最大匹配规则    
    /**
     * 构造函数,初始化敏感词库
     */
    public SensitivewordFilter(){
        sensitiveWordMap = new SensitiveWordInit().initKeyWord();
    }   
    /**
     * 判断文字是否包含敏感字符
     * @param txt  文字
     * @param matchType  匹配规则&nbsp;1:最小匹配规则,2:最大匹配规则
     * @return 若包含返回true,否则返回false
     */
    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;
    }    
    /**
     * 获取文字中的敏感词
     * @param txt 文字
     * @param matchType 匹配规则&nbsp;1:最小匹配规则,2:最大匹配规则
     * @return
     */
    public Set<String> getSensitiveWord(String txt , int matchType){
        Set<String> sensitiveWordList = new HashSet<String>();        
        for(int i = 0 ; i < txt.length() ; i++){
            int length = CheckSensitiveWord(txt, i, matchType);    //判断是否包含敏感字符
            if(length > 0){    //存在,加入list中
                sensitiveWordList.add(txt.substring(i, i+length));
                i = i + length - 1;    //减1的原因,是因为for会自增
            }
        }     
        return sensitiveWordList;
    }    
    /**
     * 替换敏感字字符
     * @param txt
     * @param matchType
     * @param replaceChar 替换字符,默认*
     */
    public String replaceSensitiveWord(String txt,int matchType,String replaceChar){
        String resultTxt = txt;
        Set<String> set = getSensitiveWord(txt, matchType);     //获取所有的敏感词
        Iterator<String> iterator = set.iterator();
        String word = null;
        String replaceString = null;
        while (iterator.hasNext()) {
            word = iterator.next();
            replaceString = getReplaceChars(replaceChar, word.length());
            resultTxt = resultTxt.replaceAll(word, replaceString);
        }
        return resultTxt;
    }    
    /**
     * 获取替换字符串
     * @param replaceChar
     * @param length
     * @return
     */
    private String getReplaceChars(String replaceChar,int length){
        String resultReplace = replaceChar;
        for(int i = 1 ; i < length ; i++){
            resultReplace += replaceChar;
        } 
        return resultReplace;
    }   
    /**
     * 检查文字中是否包含敏感字符,检查规则如下
     * @param txt
     * @param beginIndex
     * @param matchType
     * @return,如果存在,则返回敏感词字符的长度,不存在返回0
     */
    @SuppressWarnings({ "rawtypes"})
    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(SensitivewordFilter.minMatchTYpe == matchType){    //最小规则,直接返回,最大规则还需继续查找
                        break;
                    }
                }
            }
            else{     //不存在,直接返回
                break;
            }
        }
        if(matchFlag < 2 || !flag){        //长度必须大于等于1,为词 
            matchFlag = 0;
        }
        return matchFlag;
    }

//此处可写main测试

//        public static void main(String[] args) {
//        SensitivewordFilter filter = new SensitivewordFilter();
//        System.out.println("敏感词的数量:" + filter.sensitiveWordMap.size());

//        String string = "滴滴达 滴滴达 滴滴滴达,你是一个傻逼呀";
//        System.out.println("待检测语句字数:" + string.length());
//        long beginTime = System.currentTimeMillis();
//        Set<String> set = filter.getSensitiveWord(string, 1);
//        long endTime = System.currentTimeMillis();
//        System.out.println("语句中包含敏感词的个数为:" + set.size() + "。包含:" + set);
//        System.out.println("总共消耗时间为:" + (endTime - beginTime));
//        System.out.println(string);

}

4、关键字过滤工具2, 初始化敏感词库

package com.publiccms.common.tools;

import com.publiccms.logic.component.site.SiteComponent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.*;

/**

* @Author shenWB

* @Date 2019/6/27 16:36

* @Version 1.0

* 初始化敏感词库,将敏感词加入到HashMap中

**/
@Component
public class SensitiveWordInit {
    @Autowired
    private SiteComponent siteComponent;
    private static SensitiveWordInit sensitiveWordInit;
    @PostConstruct
    public void init(){
        sensitiveWordInit = this;
        sensitiveWordInit.siteComponent = this.siteComponent;
    }
    private String ENCODING = "UTF-8";    //指定字符编码    
    @SuppressWarnings("rawtypes")
    public HashMap sensitiveWordMap;    
    public SensitiveWordInit(){
        super();
    }
    @SuppressWarnings("rawtypes")
    public Map initKeyWord(){
        try {
            //读取敏感词库
            Set<String> keyWordSet = readSensitiveWordFile();
            //将敏感词库加入到HashMap中
            addSensitiveWordToHashMap(keyWordSet);
            //spring获取application,然后application.setAttribute("sensitiveWordMap",sensitiveWordMap);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sensitiveWordMap;
    }

/**
     * 读取敏感词库,将敏感词放入HashSet中,构建一个DFA算法模型
     * @param keyWordSet  敏感词库
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    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
     * @throws Exception 
     */
    @SuppressWarnings("resource")
    private Set<String> readSensitiveWordFile() throws Exception{
        String str = sensitiveWordInit.siteComponent.getWebTemplateFilePath();
        String[] arr =str.split("/");
        String filepath = arr[0]+ File.separator +"sensitive"+ File.separator+"vocabulary.txt";
        System.out.println(filepath);
        Set<String> set = null;
        File file = new File(filepath);
//        File file = new File("D:\\SensitiveWord.txt");    //读取文件
        if(!file.exists()) {
            if(!file.getParentFile().exists())file.getParentFile().mkdirs();
            file.createNewFile();
        }
        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;
    }
}

到此就已经oj8k了

java过滤关键字,敏感词汇相关推荐

  1. js过滤检测敏感词汇

    html: <textarea rows="10" cols="100" id="myDiv"></textarea> ...

  2. java 过滤关键字 自定义字典库

    使用SensitiveWord方法进行过滤 以下为过滤demo public class SensitiveWord {private StringBuilder replaceAll;//初始化pr ...

  3. 动态代理的分析以及利用动态代理模式进行敏感词汇过滤

    动态代理 增强对象的功能: 设计模式:一些通用的解决固定问题的方式 代理模式 概念: (1). 真实对象:被代理的对象 (2). 代理对象: (3). 代理模式:代理对象代理真实对象,达到增强真实对象 ...

  4. java 过滤js事件_java中的过滤器与监听器

    过滤器: Filter本身并不生成请求和响应对象,只是提供过滤功能. Filter能够在Servlet被调用之前检查Request对象,并修改Request Header和Request内容:在Ser ...

  5. Java基于Socket实现聊天、群聊、敏感词汇过滤功能

    首先的话,这个代码主要是我很久以前写的,然后当时还有很多地方没有理解,现在再来看看这份代码,实在是觉得丑陋不堪,想改,但是是真的改都不好改了- 所以,写代码,规范真的很重要. 实现的功能: 用户私聊 ...

  6. java实现前缀树--过滤敏感词汇

    一.前缀树简单介绍 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它 ...

  7. Java过滤敏感词汇算法(字典树)

    定义节点 import java.util.ArrayList; import java.util.List;public class Node {private char root;private ...

  8. 【敏感词汇过滤算法】基于DFA-前缀树的敏感词汇过滤算法(项目实用)

    在敏感词汇过滤这块,不同的算法所造成的性能差异是非常大的,选择一个合适的算法非常重要.因为以前做算法的时候做过类似前缀树的字符串匹配之类的算法,所以一开始就打算用前缀树做的,后面了解了一下DFA的相关 ...

  9. 过滤敏感词汇(trie树实现敏感词过滤)

    1.字符串匹配 (1)暴力解法:采用两个for循环,每次匹配的时间复杂度O(m*n) (2)KMP:时间复杂度O(m+n) n表示字符串的长度,m表示每个灵感词的长度 (3)trie树 字典树/单词查 ...

最新文章

  1. openlayers 根据style设置显示级别并在字体加背景框
  2. 瑞士的迷人风光(转)
  3. Python多任务(2.线程的概念以及组成(创建线程的两种方式))
  4. 创建maven项目,配置maven地址
  5. python 忽略 异常_如何忽略Python中的异常?
  6. 什么叫“职业年金”,与养老保险有什么关系?
  7. LED数码管结构与工作原理
  8. c语言运算优先级口诀简单,C语言运算符优先级和口诀
  9. 无线模块的参数介绍和选型要点
  10. LSI阵列卡的使用教程
  11. chemdraw怎么画拐弯的箭头_怎么样绘制弧形箭头?
  12. MSSqlserver的锁模式介绍
  13. Spring事务管理中异常回滚知识点总结
  14. edge如何导入html文件收藏夹,Edge浏览器如何导入导出收藏夹(目录位置)
  15. 看完知乎轮子哥的编程之路,我只想说,收下我的膝盖...
  16. ROS实践3:publisher模板教程
  17. 停车系统源码-基于springboot+uniapp前后端完全开源的多终端智慧停车场系统源码
  18. 用python给excel文件的第三列添加重复递增数字
  19. java计算机毕业设计课程在线反馈系统源代码+数据库+系统+lw文档
  20. el-table 表头自定义动态树形筛选框

热门文章

  1. Python爬取笔趣阁小说,有趣又实用!
  2. PAT-2019年冬季考试-甲级-7-1 Good in C (20分)超详解,几招就满分通过
  3. 计算机四屏故障维修,液晶显示器有哪些常见故障 液晶显示器常见故障及维修方法...
  4. 基于面向对象实现:猫抓老鼠小游戏 有一只猫和一只老鼠,当猫的体重是小于老鼠体重的5倍时,猫可以抓到老鼠。
  5. 【渝粤教育】电大中专机械设计基础 (2)作业 题库
  6. Java绘制正态分布统计图
  7. su: warning: cannot change directory to : Permission denied ;-bash: bash_profile: Permission denied
  8. LDO上电瞬间微过冲问题解决和讨论
  9. Ubuntu系统配置花生壳内网穿透
  10. A03-arcgis无法统计地块面积常见问题及解决方案