Sparkle’s Workshop

ContentRewriteFilter

Posted on December 31, 2007 - Filed Under Uncategorized |

最近翻起一年多前在上一家公司写的代码,发现也有不少工具性质的类,于是整理一下都贴出来吧

    /**
     * 2006-4-30
     * @author Sparkle
     */
    public abstract class ContentRewriteFilter implements Filter {
	protected boolean wantRewrite(HttpServletRequest request) {
		return true;
	}
 
	protected abstract String rewrite(String content,
			HttpServletRequest request, HttpServletResponse response);
 
	public void doFilter(ServletRequest req, ServletResponse res,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) req;
		if (!wantRewrite(request) || res.isCommitted()) {
			chain.doFilter(req, res);
			return;
		}
 
		HttpServletResponse response = (HttpServletResponse) res;
		StringWriter strWriter = new StringWriter();
		boolean[] support = new boolean[1];
		support[0] = true;
		chain.doFilter(req, new ContentResponseWrapper(response, strWriter,
				support));
		if (support[0] && !response.isCommitted()) {
			String content = strWriter.getBuffer().toString();
 
			content = rewrite(content, request, response);
 
			PrintWriter printWriter = response.getWriter();
			printWriter.println(content);
			printWriter.close();
		}
 
	}
 
	public void destroy() {
	}
 
	public void init(FilterConfig config) throws ServletException {
	}
    }
 
 
    public class ContentResponseWrapper extends HttpServletResponseWrapper {
	private Writer writer;
 
	private boolean[] support;
 
	public ContentResponseWrapper(HttpServletResponse response, Writer writer,
			boolean[] support) {
		super(response);
		this.writer = writer;
		this.support = support;
	}
 
	@Override
	public ServletOutputStream getOutputStream() throws IOException {
		support[0] = false;
		return super.getOutputStream();
	}
 
	@Override
	public PrintWriter getWriter() throws IOException {
		return new PrintWriter(writer);
	}
 
    }

代码点评:这段代码的作用是,获得Servlet or JSP输出的内容进行改写操作,这是一个基类,继承之后重载abstract rewrite即可获得输出的内容进行改写。这段代码在实际环境工作之后做了不少的修正,对response的commit状态,和是否成功获取内容都有较好的判断。中途用了一个[0]的技巧回传了一个boolean值。在公司里使用了这个代码实现了动态插入广告,个人短消息等资料,还有sessionid自动补充(!)等等功能

Most Commented Posts

Comments

Leave a Reply