杂七杂八笔记

1.String json=JSON.toJSONString(集合);出现字段无序情况下可以在实体类里面加上该注解实现指定排序@JSONType(orders={“第一序号”,“第二序号”,“第三序号”})
2.判断字符串中涉及的非法字符:
/**
* 默认的单例,使用自带的敏感词库
*/
public static SensitiveFilterUtils DEFAULT = new SensitiveFilterUtils(
new BufferedReader(new InputStreamReader(
SensitiveFilterUtils.class.getClassLoader().getResourceAsStream("/sensi_words")
, StandardCharsets.UTF_8)));
sensi_words(涉及非法字符的文件)

/**
 * 对句子进行敏感词过滤<br/>
 * 如果无敏感词返回输入的sentence对象,即可以用下面的方式判断是否有敏感词:<br/><code>
 * String result = filter.filter(sentence, '*');<br/>
 * if(result != sentence){<br/>
 * &nbsp;&nbsp;// 有敏感词<br/>
 * }
 * </code>
 */
public String filter(String sentence, char replace){
    // 先转换为StringPointer
    StringPointer sp = new StringPointer(sentence);

    // 标示是否替换
    boolean replaced = false;

    // 匹配的起始位置
    int i = 0;
    while(i < sp.length - 2){
        /*
         * 移动到下一个匹配位置的步进:
         * 如果未匹配为1,如果匹配是匹配的词长度
         */
        int step = 1;
        // 计算此位置开始2个字符的hash
        int hash = sp.nextTwoCharHash(i);
        /*
         * 根据hash获取第一个节点,
         * 真正匹配的节点可能不是第一个,
         * 所以有后面的for循环。
         */
        SensitiveNodeUtils node = nodes[hash & (nodes.length - 1)];
        /*
         * 如果非敏感词,node基本为null。
         * 这一步大幅提升效率
         */
        if(node != null){
            /*
             * 如果能拿到第一个节点,
             * 才计算mix(mix相同表示2个字符相同)。
             * mix的意义和HashMap先hash再equals的equals部分类似。
             */
            int mix = sp.nextTwoCharMix(i);
            /*
             * 循环所有的节点,如果非敏感词,
             * mix相同的概率非常低,提高效率
             */
            outer:
            for(; node != null; node = node.next){
                /*
                 * 对于一个节点,先根据头2个字符判断是否属于这个节点。
                 * 如果属于这个节点,看这个节点的词库是否命中。
                 * 此代码块中访问次数已经很少,不是优化重点
                 */
                if(node.headTwoCharMix == mix){
                    /*
                     * 查出比剩余sentence小的最大的词。
                     * 例如剩余sentence为"色情电影哪家强?",
                     * 这个节点含三个词从小到大为:"色情"、"色情电影"、"色情信息"。
                     * 则从“色情电影”开始向前匹配
                     */
                    NavigableSet<StringPointer> desSet = node.words.headSet(sp.substring(i), true);
                    if(desSet != null){
                        for(StringPointer word: desSet.descendingSet()){
                            /*
                             * 仍然需要再判断一次,例如"色情信息哪里有?",
                             * 如果节点只包含"色情电影"一个词,
                             * 仍然能够取到word为"色情电影",但是不该匹配。
                             */
                            if(sp.nextStartsWith(i, word)){
                                // 匹配成功,将匹配的部分,用replace制定的内容替代
                                sp.fill(i, i + word.length, replace);
                                // 跳过已经替代的部分
                                step = word.length;
                                // 标示有替换
                                replaced = true;
                                // 跳出循环(然后是while循环的下一个位置)
                                break outer;
                            }
                        }
                    }

                }
            }
        }

        // 移动到下一个匹配位置
        i += step;
    }

    // 如果没有替换,直接返回入参(节约String的构造copy)
    if(replaced){
        return sp.toString();
    }else{
        return sentence;
    }
}

 SensitiveFilterUtils filter = SensitiveFilterUtils.DEFAULT;
 String filted = filter.filter(userName, '*');
   if (userName != filted) {
                return ServerResponse.createByErrorCodeMessage(199, "您的昵称内包含敏感词汇");

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值