9Filter高级开发2--实现全站压缩
2012-10-18 17:59
225 查看
一.全站压缩式通过包装response来实现的。
二.
应用HttpServletResponseWrapper对象,压缩响应正文内容。思路:
1 通过filter向目标页面传递一个自定义的response对象;
(1)在自定义的response对象中,重写getOutputStream方法和getWriter方法,使目标资源调用此方法输出页面内容时,获得的是我们自定义的ServletOutputStream对象。
(2)在我们自定义的ServletOuputStream对象中,重写write方法,使写出的数据写出到一个buffer中。
2.当页面完成输出后,在filter中就可得到页面写出的数据,从而我们可以调用GzipOuputStream对数据进行压缩后再写出给浏览器,以此完成响应正文件压缩功能。
三、
二.
应用HttpServletResponseWrapper对象,压缩响应正文内容。思路:
1 通过filter向目标页面传递一个自定义的response对象;
(1)在自定义的response对象中,重写getOutputStream方法和getWriter方法,使目标资源调用此方法输出页面内容时,获得的是我们自定义的ServletOutputStream对象。
(2)在我们自定义的ServletOuputStream对象中,重写write方法,使写出的数据写出到一个buffer中。
2.当页面完成输出后,在filter中就可得到页面写出的数据,从而我们可以调用GzipOuputStream对数据进行压缩后再写出给浏览器,以此完成响应正文件压缩功能。
三、
//实现全站压缩 /* public class GzipFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletResponse response = (HttpServletResponse) resp; HttpServletRequest request = (HttpServletRequest) req; //用自己写的response捕获目标资源的输出 MyResponse myresponse = new MyResponse(response); chain.doFilter(request, myresponse); byte data[] = myresponse.getBufferData(); //得到目标资源输出的数据 System.out.println("原始数据的大小:" + data.length); gout(data,response); //byteOutputStream out; //servlet ---> myresponse.getOutputStream()--->MyServletOutputStream.write("hahha") //chain.doFilter(request, myresponse); } public void gout(byte data[],HttpServletResponse response) throws IOException{ ByteArrayOutputStream bout = new ByteArrayOutputStream(); GZIPOutputStream gout = new GZIPOutputStream(bout); //buffer gout.write(data); gout.close(); //一定要有 byte gzipdata[] = bout.toByteArray(); response.setHeader("content-encoding", "gzip"); response.setContentLength(gzipdata.length); response.getOutputStream().write(gzipdata); } class MyResponse extends HttpServletResponseWrapper{ private HttpServletResponse response; private ByteArrayOutputStream bout = new ByteArrayOutputStream(); private PrintWriter pw = null; public MyResponse(HttpServletResponse response) { super(response); this.response = response; } @Override public ServletOutputStream getOutputStream() throws IOException { return new MyServletOutputStream(bout); } @Override public PrintWriter getWriter() throws IOException { // TODO Auto-generated method stub pw = new PrintWriter(new OutputStreamWriter(bout,response.getCharacterEncoding())); //write("中国") return pw; } public byte[] getBufferData(){ if(pw!=null){ pw.close(); } if(bout!=null){ return bout.toByteArray(); } return null; } } class MyServletOutputStream extends ServletOutputStream{ private ByteArrayOutputStream bout; public MyServletOutputStream(ByteArrayOutputStream bout){ this.bout = bout; } @Override public void write(int b) throws IOException { //hahah bout.write(b); } } public void destroy() { // TODO Auto-generated method stub } public void init(FilterConfig filterConfig) throws ServletException { // TODO Auto-generated method stub } }
<filter> <filter-name>GzipFilter</filter-name> <filter-class>cn.itcast.web.filter.example.GzipFilter</filter-class> </filter> <filter-mapping> <filter-name>GzipFilter</filter-name> <url-pattern>*.jsp</url-pattern> <dispatcher>FORWARD</dispatcher> <dispatcher>REQUEST</dispatcher> </filter-mapping> <filter-mapping> <filter-name>GzipFilter</filter-name> <url-pattern>*.css</url-pattern> </filter-mapping> <filter-mapping> <filter-name>GzipFilter</filter-name> <url-pattern>*.js</url-pattern> </filter-mapping>
相关文章推荐
- 过滤器Filter的案例4——实现全站的数据的压缩
- Filter 全站GZIP压缩过滤的原理及其实现
- Filter高级开发(二)——实现敏感字符过滤功能
- java web使用filter进行全站压缩的原理及实现
- Filter实现全站页面Gzip压缩输出
- Android 3D游戏开发(高级篇)——Opengl ES游戏引擎实现(更新完毕)
- filter实现过滤压缩指定的请求的操作
- javaweb学习总结——Filter高级开发
- IOS高级开发~底层实现资源收集
- Filter技术实现全网站的压缩输出
- iOS开发——高级语法篇&继承、实现、依赖、关联、聚合、组合的联系与区别
- JSP 开发中过滤器filter设置编码格式的实现方法
- Android开发之图片处理专题(二):利用AsyncTask和回调接口实现图片的异步加载和压缩
- S2SH开发中拦截器的方法拦截的实现 MethodFilterInterceptor?
- Filter-全站GZIP压缩
- (高级篇 Netty多协议开发和应用)第十章-Http协议开发应用(基于Netty的HttpServer和HttpClient的简单实现)
- javaweb学习总结(四十三)——Filter高级开发
- JavaEE框架类——全站压缩——对网站内容进行数据压缩(Filter和GzipOutputStream二合一)
- javaweb学习总结——Filter高级开发