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/>
* // 有敏感词<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, "您的昵称内包含敏感词汇");
}