您的位置:首页 > 其它

使用过滤器实现敏感词的过滤

2011-11-29 12:31 429 查看
在web开发中,尤其是实现用户动态交互的开发中经常会用到“敏感词”过滤。

用来屏蔽敏感词……

今天我也试着写了写,发现其实思路有很多。我只是写了其中的一种---通过解析XML文件来实现。

当然在xml中存放,敏感词。当用户提交相关信息时,通过解析xml文件,检查是否有xml中所包含的敏感词。如果存在,则屏蔽。

下面的代码只是简单是体现了思路。并没有连接到数据库。也就是说如果实际应用的话,刚好的做法是,当从数据库中提取出文字信息时,在前台页面进行显示时,使用这种思路。这样数据库中存在的就不会是,你屏蔽后的信息。而是用户输入的原信息,只不过是显示的时候,屏蔽罢了。

===============================

前台getContent.jsp文件

========

<%@ page language="java" contentType="text/html;charset=utf-8" %>
<html>
<head><title>发表你的观点</title>
<script type="text/javascript" language="javascript">
	function getTe()
		{
			if(document.getElementById("te").value.length <= 4)
			{
				alert("100字以内");
				return false
			}
				return true;
		}
</script>
</head>
<body>
<center>
	<fieldset style="width:300px;">
		<legend>我的观点</legend>
	<form action="CharacterWrapper" method="post" onsubmit="return getTe()">
		<input type="text" name="te" value="100字以内" id="te" style="width:200px;height:150px;borderColor:blue"/><br/>
		<input type="submit" value="提    交" style="margin-left:120px"/>
	</form>
	</fieldset>
</center>
</body>
</html>


后台解析XML文件

CharacterWraper.java

===============

package cn.edu.bzu;

import java.io.File;
import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class CharacterWrapper implements Filter{
	public void init(FilterConfig config){}
	public void doFilter(ServletRequest req,ServletResponse resp,FilterChain chain)throws IOException,ServletException{
		
		HttpServletRequest request=(HttpServletRequest)req;
		HttpServletResponse response=(HttpServletResponse)resp;
		/*先去字串再比对*/
		
		String getContent=request.getParameter("te");
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		
		//使用DOM解析XML
		//首先获得DOM解析工厂,工厂的作用是用来创建DOM解析器
		DocumentBuilderFactory factory= DocumentBuilderFactory.newInstance();
		try {
			//获得DOM解析器
			DocumentBuilder builder=factory.newDocumentBuilder();
			//解析xml文件,获取Documnet对象根节点
			Document document=builder.parse(new File("../Infor.xml"));
			//创建节点集
			NodeList list=document.getElementsByTagName("information");
			//使用for循环对输入的文字进行比对过滤
			for(int i=0;i<list.getLength();i++){
				//将节点集中的每一个节点转化为元素
				Element e=(Element)list.item(i);
				//得到孩子节点,并得到其值
				String content=e.getElementsByTagName("content").item(0).getFirstChild().getNodeValue();
				for(int j=0;j<getContent.length();j++){
					if(j==getContent.length()-2)
						break;
					if(content.equals(getContent.substring(j,j+2)))
						response.getWriter().print("**");
					else
						response.getWriter().print(getContent.substring(j,j+2));
				}
			}
			
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		}finally{
			chain.doFilter(req, resp);
		}
	}
	public void destroy(){}

}


XML敏感词存储Infor.xml文件

=================

<?xml version="1.0" encoding="UTF-8"?>
<information>
		<content>***</content>
		<content>反共</content>
		<content>法轮功</content>
</information>


============================================

其实在上面的实现中还是存在缺点的,就是屏蔽两个字的敏感词。

如果想要屏蔽多个字的敏感词,为了效率起见,可以建立过个xml文件,通过解析不同的xml文件。实现……

===========

再就是其他屏蔽敏感词的方法:

使用配置文件比方说配置一个Sersitive.properties文件.

使用类继承HttpServletResponseWrapper这样,当服务器返回时,就可以截获response里面的信息。

通过重写里面getWriter()方法达到屏蔽的目的。这样,因为是从服务器返回时截获的信息,也不会影响到数据库中信息的存储,也就是说用户输入的是什么,数据库中存储的就是什么。只不过是现实的时候给屏蔽掉罢了……

========

希望这种思路可以供参考!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: