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,如需转载请自行联系原作者


相关文章
|
5天前
|
Java
利用GraalVM将java文件变成exe可执行文件
这篇文章简明地介绍了如何使用GraalVM将一个简单的Java程序编译成exe可执行文件,首先通过javac命令编译Java文件生成class文件,然后使用native-image命令将class文件转换成独立的exe文件,并展示了如何运行这个exe文件。
13 0
利用GraalVM将java文件变成exe可执行文件
|
5天前
|
Java
用java搞定时任务,将hashmap里面的值存到文件里面去
本文介绍了如何使用Java的`Timer`和`TimerTask`类创建一个定时任务,将HashMap中的键值对写入到文本文件中,并提供了完整的示例代码。
15 1
用java搞定时任务,将hashmap里面的值存到文件里面去
|
14天前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
30 2
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
|
2天前
|
消息中间件 Java 大数据
大数据-56 Kafka SpringBoot与Kafka 基础简单配置和使用 Java代码 POM文件
大数据-56 Kafka SpringBoot与Kafka 基础简单配置和使用 Java代码 POM文件
14 2
|
4天前
|
XML JavaScript Java
java与XML文件的读写
java与XML文件的读写
13 3
|
4天前
|
JSON 数据格式
LangChain-20 Document Loader 文件加载 加载MD DOCX EXCEL PPT PDF HTML JSON 等多种文件格式 后续可通过FAISS向量化 增强检索
LangChain-20 Document Loader 文件加载 加载MD DOCX EXCEL PPT PDF HTML JSON 等多种文件格式 后续可通过FAISS向量化 增强检索
14 2
|
6天前
|
存储 前端开发 Java
Java后端如何进行文件上传和下载 —— 本地版(文末配绝对能用的源码,超详细,超好用,一看就懂,博主在线解答) 文件如何预览和下载?(超简单教程)
本文详细介绍了在Java后端进行文件上传和下载的实现方法,包括文件上传保存到本地的完整流程、文件下载的代码实现,以及如何处理文件预览、下载大小限制和运行失败的问题,并提供了完整的代码示例。
77 1
|
1天前
|
JavaScript 前端开发 内存技术
js文件的入口代码及需要入口代码的原因
js文件的入口代码及需要入口代码的原因
8 0
|
5天前
|
存储 Java 程序员
【Java】文件IO
【Java】文件IO
20 0
|
5天前
|
Java Maven Spring
用Spring导致的无法运行Java文件的问题的解决方案
本文提供了解决在IntelliJ IDEA社区版中使用Spring Initializr插件创建Spring项目后,Java文件无法运行的问题的方法,主要是通过加载Maven项目来解决。
32 0