filter对页面内容敏感词进行替换处理

  平时我们做网页时,不希望页面显示一些非法内容或敏感词语,一般的做法是数据保存到数据库前先做处理或者从数据库中拿出来后再处理,然后输出到客户端(浏览器)。这种做法的局限性是,工作量大,很多地方都需要进行处理。如果使用Filter来处理就很简单,很方便了。

     做法:在Servlet将页面内容输出到response时,response将内容缓存起来,然后在Filter中处理,在输出到客户端。

     技术点:由于ServletResponse默认不能严格的缓存输出内容,因此需要自定义一个具备缓存功能的response。扩展javax.servlet.http.HttpServletResponseWrapper类来自定义一个response,该类实现了javax.servlet.http.HttpServletResponse接口的所有方法,根据需要在自己的自定义response中进行覆盖即可,比如需要对页面中的字符类内容进行处理,则覆盖父类getWriter()方法,如果需要处理二进制内容,如图片等,则覆盖父类中的getOutputStream()方法。

     下面给出一个例子源码,对页面中的敏感词语进行替换。

     首先自定义一个response

    

[java]  view plain  copy
  1. package cn.qtone.school.filter;  
  2.   
  3. import java.io.CharArrayWriter;  
  4. import java.io.IOException;  
  5. import java.io.PrintWriter;  
  6.   
  7. import javax.servlet.http.HttpServletResponse;  
  8. import javax.servlet.http.HttpServletResponseWrapper;  
  9. /** 
  10.  * 由于HttpServletResponse并不能严格的缓存输入内容,所以如果想对输入内容 
  11.  * 进行加工,就需要自定义一个具备缓存功能的response 
  12.  * 通过扩展javax.servlet.http.HttpServletResponseWrapper类来自定义自己的response 
  13.  * javax.servlet.http.HttpServletResponseWrapper实现了HttpServletResponse接口的所有 
  14.  * 方法,自定义的response只需根据需要覆盖就行了 
  15.  *<br/> 
  16.  *本类只覆盖getWriter()方法,即只对网页中的字符类内容进行加工 
  17.  */  
  18. public class CharacterResponseWrapper extends HttpServletResponseWrapper{  
  19.   
  20.     private CharArrayWriter charArrayWriter=new CharArrayWriter();//字符数组Writer  
  21.       
  22.     public CharacterResponseWrapper(HttpServletResponse response) {  
  23.         super(response);  
  24.     }  
  25.       
  26.     @Override  
  27.     //覆盖父类方法,如果response输出的内容是字符类内容,则会调用getWriter()方法  
  28.     //如果是二进制内容,如图片数据,则会调用getOutputStream()方法。  
  29.     public PrintWriter getWriter() throws IOException{  
  30.         return new PrintWriter(charArrayWriter);//返回字符数组writer,缓存内容  
  31.     }  
  32.   
  33.     public CharArrayWriter getCharArrayWriter() {  
  34.         return charArrayWriter;  
  35.     }  
  36.       
  37.       
  38. }  


再写个filter

[java]  view plain  copy
  1. package cn.qtone.school.filter;  
  2.   
  3. import java.io.FileInputStream;  
  4. import java.io.IOException;  
  5. import java.io.PrintWriter;  
  6. import java.util.Properties;  
  7.   
  8. import javax.servlet.Filter;  
  9. import javax.servlet.FilterChain;  
  10. import javax.servlet.FilterConfig;  
  11. import javax.servlet.ServletException;  
  12. import javax.servlet.ServletRequest;  
  13. import javax.servlet.ServletResponse;  
  14. import javax.servlet.http.HttpServletResponse;  
  15.   
  16. public class SensitiveWordFilter implements Filter {  
  17.   
  18.     private Properties p;//敏感词的配置文件  
  19.       
  20.     public void init(FilterConfig filterConfig) throws ServletException {  
  21.         String locationPath=filterConfig.getInitParameter("locationPath");//配置文件的路径  
  22.         if(locationPath!=null && !"".equalsIgnoreCase(locationPath)){  
  23.             String realPath=filterConfig.getServletContext().getRealPath(locationPath);  
  24.             try{  
  25.                 p=new Properties();  
  26.                 p.load(new FileInputStream(realPath));//加载配置文件  
  27.             }catch(IOException e){  
  28.                 System.out.println("敏感词文件加载失败........");  
  29.             }  
  30.         }     
  31.     }  
  32.       
  33.     public void doFilter(ServletRequest request, ServletResponse response,  
  34.             FilterChain chain) throws IOException, ServletException {  
  35.         if(p==null || p.isEmpty()){  
  36.             chain.doFilter(request, response);  
  37.         }else{  
  38.             CharacterResponseWrapper myResponse=new CharacterResponseWrapper((HttpServletResponse)response);  
  39.             //HttpServletResponse是没有缓存功能的,所以需要使用自定的response  
  40.             //使用自己定义的myResponse,这样页面内容就会暂时缓存到myResponse  
  41.             chain.doFilter(request, myResponse);  
  42.             String output=myResponse.getCharArrayWriter().toString();//得到myResponse输出的内容  
  43.             System.out.println("进行敏感词语替换......");  
  44.             //处理敏感词  
  45.             for(Object obj:p.keySet()){  
  46.                 //由于properties文件是在eclipse下用utf-8做的,文件含有中文  
  47.                 //而Properties类默认是采用ISO8859-1处理的,对中文易造成乱码  
  48.                 //需特殊处理一下  
  49.                 String oldKey=(String)obj;  
  50.                 String newKey=new String((oldKey.getBytes("ISO8859-1")),"UTF8");  
  51.                 output=output.replaceAll(newKey, p.getProperty(oldKey));//替换敏感词  
  52.             }  
  53.             //myResponse是没有向客户端输出内容功能的  
  54.             //所以最后先客户端输出还是要使用ServletResponse  
  55.             PrintWriter out=response.getWriter();  
  56.             out.write(output);  
  57.             out.close();  
  58.         }  
  59.           
  60.     }  
  61.   
  62.     public void destroy() {  
  63.         // TODO Auto-generated method stub        
  64.     }  
  65.   
  66. }  


在properties文件中写明,需要对哪些词语进行处理。

[java]  view plain  copy
  1. #敏感词语自动替换配置  
  2. 色情=**  
  3. 情色=**  
  4. 赌博=**  


然后在web.xml中配置filter

[html]  view plain  copy
  1. <!-- 过滤敏感词 -->  
  2.   <filter>  
  3.      <filter-name>sensitiveWordFilter</filter-name>  
  4.      <filter-class>cn.qtone.school.filter.SensitiveWordFilter</filter-class>  
  5.      <init-param>  
  6.         <param-name>locationPath</param-name>  
  7.         <param-value>/WEB-INF/classes/sensitive.properties</param-value>  
  8.      </init-param>  
  9.   </filter>  
  10.   <filter-mapping>  
  11.      <filter-name>sensitiveWordFilter</filter-name>  
  12.      <url-pattern>*.do</url-pattern>  
  13.   </filter-mapping>  
  14.     


看看效果

猜你喜欢

转载自blog.csdn.net/loster_li/article/details/77965893
今日推荐