前言:这个是我自己学习《Java Web 整合开发 王者归来》的学习笔记,对你们可能没有参考价值。这是filter那一章中,关于内容替换的filter和GZIP压缩Filter的学习总结。
这两个Filter中对response进行了修改,把这两个例子的代码都重新实现之后,弄懂了基本原理,但是也出现了一些困惑。
大家可以下载《Java Web 整合开发 王者归来》的源代码,查阅filter压缩文件。
内容替换Filter的学习心得
内容替换的原理是,在Servlet将内容输出到response时,response将内容缓存起来,在Filter中进行替换,然后再输出到客户端浏览器,由于默认的response不能严格地将内容缓存起来,因此需要自定义一个具备缓存功能的response。
如果response输出的的内容为字符类内容,则会调用getWrite()方法;如果是二进制内容则会调用getOutputStream()方法;
通过扩展javax.servlet.http.HttpServletResponseWrapper类覆盖其中的getWrite()方法。
package helloJava.respone; import java.io.CharArrayWriter; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; public class HttpCharacterResponseWrapper extends HttpServletResponseWrapper { private CharArrayWriter ref_charArrayWriter = new CharArrayWriter(); public HttpCharacterResponseWrapper(HttpServletResponse response) { super(response); // TODO Auto-generated constructor stub } @Override public PrintWriter getWriter() throws IOException { return new PrintWriter(ref_charArrayWriter); } public CharArrayWriter getCharArrayWriter() { return ref_charArrayWriter; } }
在Filter中将自定义的response传进Servlet中代码如下:
package helloJava.filter; import helloJava.respone.HttpCharacterResponseWrapper; 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 OutputReplaceFilter implements Filter{ //属性集合,敏感词集合 private Properties pp=new Properties(); @Override public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // TODO Auto-generated method stub //自定义的 Response HttpCharacterResponseWrapper ref_charResponse=new HttpCharacterResponseWrapper( (HttpServletResponse)response); chain.doFilter(request,ref_charResponse); String output=ref_charResponse.getCharArrayWriter().toString(); for(Object obj:pp.keySet()) { String key=(String) obj; output=output.replace(key,pp.getProperty(key)); } //这部分不是特别明白,response是入口参数传递过来的 PrintWriter out =response.getWriter(); out.write(output); out.println("<!--Generated at "+new java.util.Date()+"-->"); } @Override public void init(FilterConfig filterConfig) throws ServletException { // TODO Auto-generated method stub String file=filterConfig.getInitParameter("file"); String realPath=filterConfig.getServletContext().getRealPath(file); try { pp.load(new FileInputStream(realPath)); } catch(IOException e) { } } }