描述:论坛中经常在发帖的时候出现敏感词,这是后对于网站来说就应该进行处理。敏感词分为禁用词、替换词与审核词,禁用词的处理就是直接打给用户一句话出现非法字符。替换词就是将敏感词替换 成***之类的。审核词就是将敏感词高亮后,通过人工进行审核后再进行发表。
网上有敏感词的词库,都是txt文件,并且格式为“彩票|2”,敏感词加上级别,1为禁用词,2为替换词,3为审核词。在src下新建一个words文件夹放入词库
public class WordsFilter extends HttpFilter {
//定义三个成不同级别的敏感词的集合
private List<String> banWords = new ArrayList();
private List<String> replaceWords = new ArrayList();
private List<String> auditWords = new ArrayList();
@Override
public void init(FilterConfig filterConfig) throws ServletException {
try {
// 在初始化方法中就导入词库
// 创建file表示words文件夹
String path = WordsFilter.class.getClassLoader().getResource("words").getPath();
File dir = new File(path);
// 遍历文件夹下的文件
File[] files = dir.listFiles();
for(File file : files) {
// 逐行读取文件
BufferedReader br = new BufferedReader(new FileReader(file));
String line;
while((line=br.readLine())!=null) {
//此处/要进行转义,否则不能进行分割
String[] parts = line.split("\\|");
if(parts==null || parts.length!=2)
continue;
//注意文件中可能有空格
if(parts[1].trim().equals("1")) {
banWords.add(parts[0].trim());
} else if(parts[1].trim().equals("2")) {
replaceWords.add(parts[0].trim());
} else if(parts[1].trim().equals("3")) {
auditWords.add(parts[0].trim());
}
}
}
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
@Override
public void doFilter(HttpServletRequest request,
HttpServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 拦截所有的请求 检查请求参数的内容
String data = request.getParameter("data");
// 禁用词的处理
// 检查是否包含禁用词 循环遍历禁用词
for(String word : banWords) {
// word 现在是一个正则表达式,例如 他[ @##$$%%*()]*妈[ @##$$%%*()]*的[ @##$$%%*()]*
//但是这个不能完全防范住
//Pattern的compile方法为编译正则表达式,返回表达式对象
Pattern pattern = Pattern.compile(word);
//用正则对象去匹配一下提交的数据
Matcher matcher = pattern.matcher(data);
//通过匹配器的find方法去找
if(matcher.find()) {
request.setAttribute("message", "文章中包含非法词汇,请审核后发表!");
request.getRequestDispatcher("/form.jsp").forward(request, response);
return ;
}
}
//对于替换词的处理
//我们希望调用getParameter方法以后就已经将敏感词替换好了,因此对request 进行包装
WordsRequest wordrequest = new WordsRequest(request);
// 放行
chain.doFilter(wordrequest, response);
}
//由于要用到集合,所以将这个包装方法移到类中,成为内部类,这样就能使用成员变量了。
class WordsRequest extends HttpServletRequestWrapper {
public WordsRequest(HttpServletRequest request) {
super(request);
}
@Override
public String getParameter(String name) {
// 首先获得用户提交的数据
String value = super.getParameter(name);
// 遍历集合
for(String word : replaceWords) {
// 将value中所有的当前需要替换的词都替换,这里要注意replaceAll方法返回一个新的字符串,要用原有的记住新的
value = value.replaceAll(word, "****");
}
// 对审核词的处理
for(String word : auditWords) {
// 将审核词修改颜色,成为高亮
value = value.replaceAll(word, "<font color='red'>" + word + "</font>");
}
return value;
}
}
}