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

来源:互联网 发布:cs1.6自瞄源码 编辑:程序博客网 时间:2024/05/09 12:59
 在web开发中,尤其是实现用户动态交互的开发中经常会用到“敏感词”过滤。
用来屏蔽敏感词……
今天我也试着写了写,发现其实思路有很多。我只是写了其中的一种---通过解析XML文件来实现。
当然在xml中存放,敏感词。当用户提交相关信息时,通过解析xml文件,检查是否有xml中所包含的敏感词。如果存在,则屏蔽。
下面的代码只是简单是体现了思路。并没有连接到数据库。也就是说如果实际应用的话,刚好的做法是,当从数据库中提取出文字信息时,在前台页面进行显示时,使用这种思路。这样数据库中存在的就不会是,你屏蔽后的信息。而是用户输入的原信息,只不过是显示的时候,屏蔽罢了。
===============================
前台getContent.jsp文件
========
[html] view plaincopyprint?
  1. <%@ page language="java" contentType="text/html;charset=utf-8" %>  
  2. <html>  
  3. <head><title>发表你的观点</title>  
  4. <script type="text/javascript" language="javascript">  
  5.     function getTe()  
  6.         {  
  7.             if(document.getElementById("te").value.length <= 4)  
  8.             {  
  9.                 alert("100字以内");  
  10.                 return false  
  11.             }  
  12.                 return true;  
  13.         }  
  14. </script>  
  15. </head>  
  16. <body>  
  17. <center>  
  18.     <fieldset style="width:300px;">  
  19.         <legend>我的观点</legend>  
  20.     <form action="CharacterWrapper" method="post" onsubmit="return getTe()">  
  21.         <input type="text" name="te" value="100字以内" id="te" style="width:200px;height:150px;borderColor:blue"/><br/>  
  22.         <input type="submit" value="提    交" style="margin-left:120px"/>  
  23.     </form>  
  24.     </fieldset>  
  25. </center>  
  26. </body>  
  27. </html>  

后台解析XML文件
CharacterWraper.java
===============
[java] view plaincopyprint?
  1. package cn.edu.bzu;  
  2.   
  3. import java.io.File;  
  4. import java.io.IOException;  
  5.   
  6. import javax.servlet.Filter;  
  7. import javax.servlet.FilterChain;  
  8. import javax.servlet.FilterConfig;  
  9. import javax.servlet.ServletException;  
  10. import javax.servlet.ServletRequest;  
  11. import javax.servlet.ServletResponse;  
  12. import javax.servlet.http.HttpServletRequest;  
  13. import javax.servlet.http.HttpServletResponse;  
  14. import javax.xml.parsers.DocumentBuilder;  
  15. import javax.xml.parsers.DocumentBuilderFactory;  
  16. import javax.xml.parsers.ParserConfigurationException;  
  17.   
  18. import org.w3c.dom.Document;  
  19. import org.w3c.dom.Element;  
  20. import org.w3c.dom.NodeList;  
  21. import org.xml.sax.SAXException;  
  22.   
  23.   
  24. public class CharacterWrapper implements Filter{  
  25.     public void init(FilterConfig config){}  
  26.     public void doFilter(ServletRequest req,ServletResponse resp,FilterChain chain)throws IOException,ServletException{  
  27.           
  28.         HttpServletRequest request=(HttpServletRequest)req;  
  29.         HttpServletResponse response=(HttpServletResponse)resp;  
  30.         /*先去字串再比对*/  
  31.           
  32.         String getContent=request.getParameter("te");  
  33.         request.setCharacterEncoding("utf-8");  
  34.         response.setCharacterEncoding("utf-8");  
  35.           
  36.         //使用DOM解析XML   
  37.         //首先获得DOM解析工厂,工厂的作用是用来创建DOM解析器  
  38.         DocumentBuilderFactory factory= DocumentBuilderFactory.newInstance();  
  39.         try {  
  40.             //获得DOM解析器   
  41.             DocumentBuilder builder=factory.newDocumentBuilder();  
  42.             //解析xml文件,获取Documnet对象根节点   
  43.             Document document=builder.parse(new File("../Infor.xml"));  
  44.             //创建节点集   
  45.             NodeList list=document.getElementsByTagName("information");  
  46.             //使用for循环对输入的文字进行比对过滤   
  47.             for(int i=0;i<list.getLength();i++){  
  48.                 //将节点集中的每一个节点转化为元素   
  49.                 Element e=(Element)list.item(i);  
  50.                 //得到孩子节点,并得到其值   
  51.                 String content=e.getElementsByTagName("content").item(0).getFirstChild().getNodeValue();  
  52.                 for(int j=0;j<getContent.length();j++){  
  53.                     if(j==getContent.length()-2)  
  54.                         break;  
  55.                     if(content.equals(getContent.substring(j,j+2)))  
  56.                         response.getWriter().print("**");  
  57.                     else  
  58.                         response.getWriter().print(getContent.substring(j,j+2));  
  59.                 }  
  60.             }  
  61.               
  62.         } catch (ParserConfigurationException e) {  
  63.             e.printStackTrace();  
  64.         } catch (SAXException e) {  
  65.             e.printStackTrace();  
  66.         }finally{  
  67.             chain.doFilter(req, resp);  
  68.         }  
  69.     }  
  70.     public void destroy(){}  
  71.   
  72. }  


XML敏感词存储Infor.xml文件

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

[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <information>  
  3.         <content>色情</content>  
  4.         <content>反共</content>  
  5.         <content>法轮功</content>  
  6. </information>  


============================================
其实在上面的实现中还是存在缺点的,就是屏蔽两个字的敏感词。
如果想要屏蔽多个字的敏感词,为了效率起见,可以建立过个xml文件,通过解析不同的xml文件。实现……
===========
再就是其他屏蔽敏感词的方法:
         使用配置文件比方说配置一个Sersitive.properties文件.
        使用类继承HttpServletResponseWrapper这样,当服务器返回时,就可以截获response里面的信息。
        通过重写里面getWriter()方法达到屏蔽的目的。这样,因为是从服务器返回时截获的信息,也不会影响到数据库中信息的存储,也就是说用户输入的是什么,数据库中存储的就是什么。只不过是现实的时候给屏蔽掉罢了……
========
希望这种思路可以供参考!

原文链接:http://blog.csdn.net/jinzi12345678/article/details/7022939

原创粉丝点击