filter修改response学习笔记
2013-06-05 22:46
357 查看
前言:这个是我自己学习《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.gzip; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; import helloJava.gzip.GZipOutputStream; public class GZipResponseWrapper extends HttpServletResponseWrapper { private HttpServletResponse ref_response; //自定义的outputStream,执行close()的时候对数据压缩,并输出 private GZipOutputStream ref_gzipOutputStream; //自定义printWriter,将内容输出到GZipOutputStream中 private PrintWriter ref_writer; public GZipResponseWrapper(HttpServletResponse response) { super(response); // TODO Auto-generated constructor stub this.ref_response=response; } public ServletOutputStream getOutputStream()throws IOException { if(ref_gzipOutputStream==null) ref_gzipOutputStream=new GZipOutputStream(ref_response); return ref_gzipOutputStream; } public PrintWriter getWriter() throws IOException { if (ref_writer == null) ref_writer = new PrintWriter(new OutputStreamWriter( new GZipOutputStream(ref_response), "UTF-8")); return ref_writer; } // 压缩后数据长度会发生变化 因此将该方法内容置空 public void setContentLength(int contentLength) { } public void flushBuffer()throws IOException { ref_gzipOutputStream.flush(); } public void finishResponse()throws IOException { if(ref_gzipOutputStream!=null) ref_gzipOutputStream.close(); if(ref_writer!=null) ref_writer.close(); } }GZipResponseWrapper 我困惑的是对于文本文件的压缩是怎么完成的? 对于getWriter()的源代码覆盖代码,中有GZipOutputStream部分,结合GZipResponseWrapper中的Close方法代码,我认为文本类的压缩也是通过GZipOutputStream完成的,而且PrintWriter的write方法可以接受byte[]的参数。
public PrintWriter getWriter() throws IOException { if (ref_writer == null) ref_writer = new PrintWriter(new OutputStreamWriter( new GZipOutputStream(ref_response), "UTF-8")); return ref_writer; }
菜包子
2013年6月5日22:45:00 于宿舍
相关文章推荐
- Linux netfilter 学习笔记 之十四 netfilter模块会修改数据包关联的路由缓存吗
- Filter学习笔记
- JSP学习笔记05-response
- 80x86汇编语言学习笔记(二)二次修改版
- Intent进阶 和 Intent-filter 学习笔记
- opencv3.0学习笔记一:boxFilter(...)
- C#学习笔记1-类型之间的转换 分享修改删除
- DCMTK开源库的学习笔记3:dcmtk文件中数据元的修改
- linux学习笔记——日志分析管理同步、修改时间、同步时间
- Linux netfilter 学习笔记 之五 ip层netfilter的table中规则的匹配检查
- SQL Server 2008 学习笔记(三)视图的创建与修改
- 【Ext.Net学习笔记】05:Ext.Net GridPanel的用法(包含Filter、Sorter、Grouping、汇总(Summary)的用法)
- 20160322 javaweb 学习笔记--response 重定向
- 20160322 javaweb 学习笔记--response验证码实现
- VC++ 深入详解 学习笔记(5) -- 修改窗口样式续
- python学习笔记:extend和apend;strip,split,filter,map
- ASP.NET MVC学习笔记-----Filter
- MySQL学习笔记-约束以及修改数据表
- SQL学习笔记--创建表、约束、修改表
- 【mysql索引技术和字段修改】学习笔记