gzip压缩js和html文件java源码

简介:

gzip压缩js和html文件java源码

作者:张颋 版本:V1.0 最后更新日期:2013/4/25  http://idata.blog.51cto.com

静态文件压缩是十年前的技术,在视频、图片占据带宽主流的今天对很多网站已不再重要。但是,对于数据服务而言,静态文件压缩技术依然可以摆在显著位置值得一提,甚至可以说比十年前更加重要了。究其原因根本上是因为javascript和html5。在数据服务领域,笔者相信基于javascript+html5的数据可视化技术会成为未来的主流,这正是压缩技术的用武之地。

引入第三方jar包实现压缩是可行的,但是这是以牺牲灵活性和简单性为代价的。在技术进步竞争激烈的今天,关键技术成为黑盒就好比与人赛跑的您身上又多了一道枷锁。下面的代码已在生产环境证实可行,期待您的反馈:

web.xml

 
  1. <!-- ResponseFilter must be executed as the last one of the filter chain.--> 
  2. <filter> 
  3.     <filter-name>ResponseFilter</filter-name> 
  4.     <filter-class>com.datawebservice.ResponseFilter</filter-class> 
  5. </filter> 
  6.    <filter-mapping>     
  7.         <filter-name>ResponseFilter</filter-name> 
  8.         <url-pattern>/*</url-pattern>     
  9.    </filter-mapping> 

ResponseFilter.java

 
  1. package com.datawebservice;  
  2.  
  3. import java.io.ByteArrayOutputStream;  
  4. import java.io.IOException;  
  5. import java.util.zip.GZIPOutputStream;  
  6.  
  7. import javax.servlet.Filter;  
  8. import javax.servlet.FilterChain;  
  9. import javax.servlet.FilterConfig;  
  10. import javax.servlet.ServletOutputStream;  
  11. import javax.servlet.ServletException;  
  12. import javax.servlet.ServletRequest;  
  13. import javax.servlet.ServletResponse;  
  14. import javax.servlet.http.HttpServletRequest;  
  15. import javax.servlet.http.HttpServletResponse;  
  16.  
  17. public class ResponseFilter implements Filter {  
  18.         public void init(FilterConfig filterConfig) throws ServletException {}  
  19.         public void doFilter(ServletRequest request, ServletResponse response,  
  20.                         FilterChain filterChain) throws IOException, ServletException {  
  21.                 HttpServletRequest httpServletRequest = (HttpServletRequest) request;  
  22.                 HttpServletResponse httpServletResponse = (HttpServletResponse) response;  
  23.                   
  24.                 String requestURI = httpServletRequest.getRequestURI();  
  25.                 if (requestURI.endsWith("html")|| requestURI.endsWith("js"))  
  26.                 {  
  27.                     ResponseWrapper wrapper = new ResponseWrapper(httpServletResponse);  
  28.                     filterChain.doFilter(request, wrapper);  
  29.                     String resultText = wrapper.getResultText();                      
  30.                     wrapper.close();  
  31.           
  32.                     //压缩  
  33.                     ByteArrayOutputStream os = new ByteArrayOutputStream();     
  34.                     GZIPOutputStream gzip = new GZIPOutputStream(os);     
  35.                     gzip.write(resultText.getBytes("UTF-8"));     
  36.                     gzip.close();     
  37.                        
  38.                      //输出  
  39.                      byte[] bytes = os.toByteArray();              
  40.                      httpServletResponse.setContentType("text/html; charset=UTF-8");   
  41.                      httpServletResponse.addHeader("Content-Length",Integer.toString(bytes.length));   
  42.                      httpServletResponse.addHeader("Content-Encoding""gzip");  
  43.                      ServletOutputStream output = httpServletResponse.getOutputStream();  
  44.                      output.write(bytes);  
  45.                      output.flush();  
  46.                      output.close();  
  47.                 }else {  
  48.                     filterChain.doFilter(httpServletRequest, httpServletResponse);  
  49.                 }  
  50.         }  
  51.         public void destroy() {}  

ResponseWrapper.java

 
  1. package com.datawebservice;  
  2.  
  3. import java.io.ByteArrayOutputStream;  
  4. import java.io.IOException;  
  5. import java.io.PrintWriter;  
  6. import java.io.Writer;  
  7.  
  8. import javax.servlet.ServletOutputStream;  
  9. import javax.servlet.http.HttpServletResponse;  
  10. import javax.servlet.http.HttpServletResponseWrapper;  
  11.  
  12. public class ResponseWrapper extends HttpServletResponseWrapper {  
  13.     private String responseText="";  
  14.     private ByteArrayOutputStream responseStream=null;  
  15.       
  16.     public ResponseWrapper(HttpServletResponse response) {  
  17.         super(response);  
  18.         responseStream = new ByteArrayOutputStream();  
  19.     }  
  20.  
  21.     public String getResultText() {  
  22.         if(responseText.equals("")){  
  23.             try{  
  24.                 responseText= new String(responseStream.toByteArray(),"UTF-8");  
  25.             }catch(Exception e){  
  26.                 System.out.println("getResultText exception");  
  27.                 System.out.println(e.getMessage());  
  28.             }  
  29.         }  
  30.         return responseText;  
  31.     }  
  32.  
  33.     public byte[] getStreamBytes() {  
  34.         return responseStream.toByteArray();  
  35.     }  
  36.       
  37.     public void close(){  
  38.         try{  
  39.           responseStream.close();  
  40.         }catch(Exception e){  
  41.             System.out.println("ResponseWrapper.responseStream.close() throw exception");  
  42.             System.out.println(e.getMessage());  
  43.         }  
  44.     }  
  45.  
  46.     public ServletOutputStream getOutputStream() throws IOException {  
  47.         return (new MyServletOutputStream());  
  48.     }  
  49.        
  50.     public PrintWriter getWriter() throws IOException {  
  51.         return (new MyPrintWriter(new PrintWriter(new MyServletOutputStream())));  
  52.     }  
  53.       
  54.       class MyServletOutputStream extends ServletOutputStream{  
  55.           MyServletOutputStream(){  
  56.           }  
  57.           public void close() throws IOException {  
  58.               super.close();        
  59.           }  
  60.           public void flush() throws IOException {  
  61.                 super.flush();  
  62.           }  
  63.           public void write(int b) throws IOException {  
  64.                 write((byte)b);  
  65.           }             
  66.           public void write(byte b[]) throws IOException {  
  67.               write(b, 0, b.length);  
  68.           }  
  69.           public void write(byte b[], int off, int len) throws IOException {  
  70.              responseStream.write(b, off, len);                
  71.           }//end write            
  72.       }//end class MyServletOutputStream  
  73.  
  74.       class MyPrintWriter extends PrintWriter{  
  75.           MyPrintWriter(Writer out){  
  76.               super(out);  
  77.           }  
  78.           public void flush(){  
  79.           }  
  80.           public void close(){  
  81.           }  
  82.           public void write(int b) {  
  83.               char[] cb = new char[1];  
  84.               cb[0]=(char)b;  
  85.               write(cb);  
  86.           }  
  87.           public void write(char[] chars) {  
  88.               write(chars,0,chars.length);  
  89.           }         
  90.           public void write(String s){  
  91.               responseText=responseText+s;              
  92.           }  
  93.           public void write(char buf[],int off,int len){  
  94.               responseText=responseText+String.copyValueOf(buf, off, len);  
  95.           }  
  96.           public void write(String s,int off,int len){  
  97.               responseText=responseText+s.substring(off, off+len);  
  98.           }           
  99.       }  

补充说明:我使用了内部类来简化代码。如果您不乏冒险精神,这份代码也可用于压缩jsp。





 本文转自 hexiaini235 51CTO博客,原文链接:http://blog.51cto.com/idata/1186176,如需转载请自行联系原作者


目录
打赏
0
0
0
0
348
分享
相关文章
|
9天前
|
【源码】【Java并发】【ThreadLocal】适合中学者体质的ThreadLocal源码阅读
前言 下面,跟上主播的节奏,马上开始ThreadLocal源码的阅读( ̄▽ ̄)" 内部结构 如下图所示,我们可以知道,每个线程,都有自己的threadLocals字段,指向ThreadLocalMap
266 81
【源码】【Java并发】【ThreadLocal】适合中学者体质的ThreadLocal源码阅读
|
6天前
|
【源码】【Java并发】【ReentrantLock】适合中学者体质的ReentrantLock源码阅读
因为本文说的是ReentrantLock源码,因此会默认,大家对AQS有基本的了解(比如同步队列、条件队列大概> 长啥样?)。 不懂AQS的小朋友们,你们好呀!也欢迎先看看这篇
55 13
【源码】【Java并发】【ReentrantLock】适合中学者体质的ReentrantLock源码阅读
|
10天前
|
【源码】【Java并发】【AQS】从ReentrantLock、Semaphore、CutDownLunch、CyclicBarrier看AQS源码
前言 主播觉得,AQS的原理,就是通过这2个队列的协助,实现核心功能,同步队列(CLH队列)和条件队列(Condition队列)。 同步队列(CLH队列) 作用:管理需要获...
57 18
【源码】【Java并发】【AQS】从ReentrantLock、Semaphore、CutDownLunch、CyclicBarrier看AQS源码
|
1天前
|
【源码】【Java并发】【LinkedBlockingQueue】适合中学体质的LinkedBlockingQueue入门
前言 有了前文对简单实用的学习 【Java并发】【LinkedBlockingQueue】适合初学体质的LinkedBlockingQueue入门 聪明的你,一定会想知道更多。哈哈哈哈哈,下面主播就...
26 6
【源码】【Java并发】【LinkedBlockingQueue】适合中学体质的LinkedBlockingQueue入门
|
2天前
|
【源码】【Java并发】【ArrayBlockingQueue】适合中学者体质的ArrayBlockingQueue
前言 通过之前的学习是不是学的不过瘾,没关系,马上和主播来挑战源码的阅读 【Java并发】【ArrayBlockingQueue】适合初学体质的ArrayBlockingQueue入门 还有一件事
37 5
【源码】【Java并发】【ArrayBlockingQueue】适合中学者体质的ArrayBlockingQueue
|
8天前
|
【源码】【Java并发】从InheritableThreadLocal和TTL源码的角度来看父子线程传递
本文涉及InheritableThreadLocal和TTL,从源码的角度,分别分析它们是怎么实现父子线程传递的。建议先了解ThreadLocal。
47 4
【源码】【Java并发】从InheritableThreadLocal和TTL源码的角度来看父子线程传递
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
59 14
【Javascript系列】Terser除了压缩代码之外,还有优化代码的功能
Terser 是一款广泛应用于前端开发的 JavaScript 解析器和压缩工具,常被视为 Uglify-es 的替代品。它不仅能高效压缩代码体积,还能优化代码逻辑,提升可靠性。例如,在调试中发现,Terser 压缩后的代码对删除功能确认框逻辑进行了优化。常用参数包括 `compress`(启用压缩)、`mangle`(变量名混淆)和 `output`(输出配置)。更多高级用法可参考官方文档。
91 11
[Java计算机毕设]基于ssm的OA办公管理系统的设计与实现,附源码+数据库+论文+开题,包安装调试
OA办公管理系统是一款基于Java和SSM框架开发的B/S架构应用,适用于Windows系统。项目包含管理员、项目管理人员和普通用户三种角色,分别负责系统管理、请假审批、图书借阅等日常办公事务。系统使用Vue、HTML、JavaScript、CSS和LayUI构建前端,后端采用SSM框架,数据库为MySQL,共24张表。提供完整演示视频和详细文档截图,支持远程安装调试,确保顺利运行。
92 17
干货含源码!如何用Java后端操作Docker(命令行篇)
只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等