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

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

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

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

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

     首先自定义一个response

    

package cn.qtone.school.filter;

import java.io.CharArrayWriter;
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
/**
 * 由于HttpServletResponse并不能严格的缓存输入内容,所以如果想对输入内容
 * 进行加工,就需要自定义一个具备缓存功能的response
 * 通过扩展javax.servlet.http.HttpServletResponseWrapper类来自定义自己的response
 * javax.servlet.http.HttpServletResponseWrapper实现了HttpServletResponse接口的所有
 * 方法,自定义的response只需根据需要覆盖就行了
 *<br/>
 *本类只覆盖getWriter()方法,即只对网页中的字符类内容进行加工
 */
public class CharacterResponseWrapper extends HttpServletResponseWrapper{

	private CharArrayWriter charArrayWriter=new CharArrayWriter();//字符数组Writer
	
	public CharacterResponseWrapper(HttpServletResponse response) {
		super(response);
	}
	
	@Override
	//覆盖父类方法,如果response输出的内容是字符类内容,则会调用getWriter()方法
	//如果是二进制内容,如图片数据,则会调用getOutputStream()方法。
	public PrintWriter getWriter() throws IOException{
		return new PrintWriter(charArrayWriter);//返回字符数组writer,缓存内容
	}

	public CharArrayWriter getCharArrayWriter() {
		return charArrayWriter;
	}
	
	
}


再写个filter

package cn.qtone.school.filter;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Properties;

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.HttpServletResponse;

public class SensitiveWordFilter implements Filter {

	private Properties p;//敏感词的配置文件
	
	public void init(FilterConfig filterConfig) throws ServletException {
		String locationPath=filterConfig.getInitParameter("locationPath");//配置文件的路径
		if(locationPath!=null && !"".equalsIgnoreCase(locationPath)){
			String realPath=filterConfig.getServletContext().getRealPath(locationPath);
			try{
				p=new Properties();
				p.load(new FileInputStream(realPath));//加载配置文件
			}catch(IOException e){
				System.out.println("敏感词文件加载失败........");
			}
		}	
	}
	
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		if(p==null || p.isEmpty()){
			chain.doFilter(request, response);
		}else{
			CharacterResponseWrapper myResponse=new CharacterResponseWrapper((HttpServletResponse)response);
			//HttpServletResponse是没有缓存功能的,所以需要使用自定的response
			//使用自己定义的myResponse,这样页面内容就会暂时缓存到myResponse
			chain.doFilter(request, myResponse);
			String output=myResponse.getCharArrayWriter().toString();//得到myResponse输出的内容
			System.out.println("进行敏感词语替换......");
			//处理敏感词
			for(Object obj:p.keySet()){
				//由于properties文件是在eclipse下用utf-8做的,文件含有中文
				//而Properties类默认是采用ISO8859-1处理的,对中文易造成乱码
				//需特殊处理一下
				String oldKey=(String)obj;
				String newKey=new String((oldKey.getBytes("ISO8859-1")),"UTF8");
				output=output.replaceAll(newKey, p.getProperty(oldKey));//替换敏感词
			}
			//myResponse是没有向客户端输出内容功能的
			//所以最后先客户端输出还是要使用ServletResponse
			PrintWriter out=response.getWriter();
			out.write(output);
			out.close();
		}
		
	}

	public void destroy() {
		// TODO Auto-generated method stub		
	}

}


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

#敏感词语自动替换配置
色情=**
情色=**
赌博=**


然后在web.xml中配置filter

<!-- 过滤敏感词 -->
  <filter>
     <filter-name>sensitiveWordFilter</filter-name>
     <filter-class>cn.qtone.school.filter.SensitiveWordFilter</filter-class>
     <init-param>
     	<param-name>locationPath</param-name>
     	<param-value>/WEB-INF/classes/sensitive.properties</param-value>
     </init-param>
  </filter>
  <filter-mapping>
  	 <filter-name>sensitiveWordFilter</filter-name>
  	 <url-pattern>*.do</url-pattern>
  </filter-mapping>
  


看看效果

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值