最近有空就看看http://www.onjava.com上的文章, 作一些笔记。这是第一篇。讲的是Servlet Filter,原文在这而儿http://www.onjava.com/pub/a/onjava/2003/11/19/filters.html。
这篇文章里讲了两个Filter,Caching Filter and Compression Filter。说这是每个web应用程序必备的两个Filter,可是在我做过的项目里确一个都没用过(实际上我只做过一两个项目:>)。做过Caching,但不是以Filter的形式做的,OSCache就有一种cache的Filter用法。所以Caching Filter我不是很好奇,这里我比较感兴趣的是Compression Filter。一种将response content压缩的filter,以此减少数据流量,加快相应速度。这对于一些大块的文本内容的确能起到一些预期的作用。
HTTP protocol allows for GZIP compression,正因为如此,GZIPFilter就能实现了,但是并不是所有的浏览器都支持GZIP。所以我们要在压缩前判断客户端浏览器是不是支持。
...
public class GZIPFilter implements Filter {
// custom implementation of the doFilter method
public void doFilter(ServletRequest req,
ServletResponse res,
FilterChain chain)
throws IOException, ServletException {
// make sure we are dealing with HTTP
if (req instanceof HttpServletRequest) {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
// check for the HTTP header that
// signifies GZIP support
String ae = request.getHeader("accept-encoding");
if (ae != null && ae.indexOf("gzip") != -1) {
System.out.println("GZIP supported, compressing.");
GZIPResponseWrapper wrappedResponse = new GZIPResponseWrapper(response);
chain.doFilter(req, wrappedResponse);
wrappedResponse.finishResponse();
return;
}
chain.doFilter(req, res);
}
}
至于怎么实现压缩就不说了。这里还有一点要注意的是当我们与Caching Filter一起使用时,并且Caching Filter在Compression Filter之前,那么Caching Filter将直接返回压缩后的相应信息。那么如果客户端不支持GZIP,咋办?
有个家伙做了一个项目,专门实现了这个Filter,http://sourceforge.net/projects/pjl-comp-filter/。
这位作者后来还有一篇文章 Another Java Servlet Filter Most Web Applications Should Have ,这个Filter只是在Response里设置一些头信息以让客户端浏览器缓存某些请求的相应,以此减少向服务器发送请求的次数。得好好看看HTTP,可能得到另外一些启发。
你可以使用这个链接引用该篇文章 http://publishblog.blogchina.com/blog/tb.b?diaryID=401926