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