内容替换filter

本文介绍了一种通过自定义HTTPServletResponse实现敏感词过滤的方法。该方法利用了ServletResponse的特性,通过覆写getWriter方法来缓存输出内容,并在过滤器中替换敏感词汇。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

工作原理:在servlet将内容输出到response时,response将内容缓存起来,在filter中进行替换,然后再输出到客户端浏览器。由于默认的response并不能严格的缓存输出内容,                     因此需要自定义一个具备缓存功能的response。可以通过扩展javax.servlet.http.HttpServletResponse类来实现自定义的response,只要覆盖相应的方法即可。

1、HttpServletResponseWrapperDemo.java

package servlet;

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

import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

public class HttpServletResponseWrapperDemo extends HttpServletResponseWrapper {

	private CharArrayWriter charArrayWriter = new CharArrayWriter();
	public HttpServletResponseWrapperDemo(HttpServletResponse response) {
		super(response);
	}

	@Override
	public PrintWriter getWriter() throws IOException {
		return new PrintWriter(charArrayWriter);
	}

	public CharArrayWriter getCharArrayWriter() {
		return charArrayWriter;
	}
	
}

2、OutputReplaceFilter.java

package filter;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.Locale;
import java.util.ResourceBundle;

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;

import servlet.HttpServletResponseWrapperDemo;

public class OutputReplaceFilter implements Filter {
	private ResourceBundle bundle = null;
	@Override
	public void destroy() {
		
	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
		HttpServletResponseWrapperDemo response = new HttpServletResponseWrapperDemo((HttpServletResponse)resp);
		chain.doFilter(req, response);
		String output = response.getCharArrayWriter().toString();
		Enumeration<String> enu = bundle.getKeys();
		while(enu.hasMoreElements()){
			String key = enu.nextElement();
			output = output.replace(key, bundle.getString(key));
		}
		PrintWriter out = resp.getWriter();
		out.print(output);
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		bundle = ResourceBundle.getBundle("sensitive", Locale.getDefault());
	}

}
3、sensitive.properties

china = China
\u738B\u516B\u86CB = **
4、web.xml

<filter>
  	<filter-name>sensitiveFilter</filter-name>
  	<filter-class>filter.OutputReplaceFilter</filter-class>
  </filter>
  <filter-mapping>
 	<filter-name>sensitiveFilter</filter-name>
 	<url-pattern>*.jsp</url-pattern>
  </filter-mapping>




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值