Gzip压缩优化网站

网站常使用GZIP压缩算法对网页内容进行压缩,然后传给浏览器,以减小数据传输量,提高响应速度。浏览器接收到GZIP压缩数据后会自动解压并正确显示。GZIP加速常用于解决网速慢的瓶颈。

压缩Filter中需要先判断客户浏览器时候支持GZip自动解压,如果支持,则进行GZIP压缩,否则不压缩。判断的依据是浏览器提供的Header信息,代码如下:

GZipFilter.java

 1 ?package com.rom.util;
 2
 3 import java.io.IOException;
 4
 5 import javax.servlet.Filter;
 6 import javax.servlet.FilterChain;
 7 import javax.servlet.FilterConfig;
 8 import javax.servlet.ServletException;
 9 import javax.servlet.ServletRequest;
10 import javax.servlet.ServletResponse;
11 import javax.servlet.http.HttpServletRequest;
12 import javax.servlet.http.HttpServletResponse;
13
14 /**
15  * Servlet Filter implementation class GzipFilter
16  */
17 public class GzipFilter implements Filter {
18
19     /**
20      * Default constructor.
21      */
22     public GzipFilter() {
23         // TODO Auto-generated constructor stub
24     }
25
26     /**
27      * @see Filter#destroy()
28      */
29     public void destroy() {
30         // TODO Auto-generated method stub
31     }
32
33     /**
34      * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
35      */
36     public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
37         // TODO Auto-generated method stub
38         // place your code here
39
40         System.out.println("压缩的");
41
42
43         // TODO Auto-generated method stub
44         HttpServletRequest request = (HttpServletRequest)req;
45         HttpServletResponse response =(HttpServletResponse)res;
46
47         String acceptEncoding =request.getHeader("Accept-Encoding");
48         //支持的编码方式
49
50         try {
51             if(acceptEncoding != null && acceptEncoding.toLowerCase().indexOf("gzip") != -1){
52
53                 System.out.println("执行压缩的方法");
54
55                 //如果客户浏览器支持GZIP格式,则使用GZIP压缩数据
56                 GZipResponseWrapper gzipRes = new GZipResponseWrapper(response);
57
58                 chain.doFilter(request, gzipRes);//doFilter,使用自定义的response
59                 gzipRes.finishResponse();//输出压缩数据
60
61             }else{
62                 System.out.println("没有压缩");
63
64                 chain.doFilter(request, response);//否则不压缩
65             }
66 //          chain.doFilter(request, response);
67         } catch (IOException e) {
68             e.printStackTrace();
69         } catch (ServletException e) {
70             e.printStackTrace();
71         }
72     }
73
74     /**
75      * @see Filter#init(FilterConfig)
76      */
77     public void init(FilterConfig fConfig) throws ServletException {
78         // TODO Auto-generated method stub
79     }
80
81 }

GZipResponseWrapper为自定义的response类,内部将对输出的内容进行GZIP压缩。它集成HttpServletResponseWrapper类,也是一个“伪装”的response,不真正输出内容到客户端。

GZipResponseWrapper.java

 1 package com.rom.util;
 2
 3 import java.io.IOException;
 4 import java.io.OutputStreamWriter;
 5 import java.io.PrintWriter;
 6
 7 import javax.servlet.ServletOutputStream;
 8 import javax.servlet.http.HttpServletResponse;
 9 import javax.servlet.http.HttpServletResponseWrapper;
10
11 public class GZipResponseWrapper extends HttpServletResponseWrapper {
12      // 默认的 response
13     private HttpServletResponse response;
14
15     // 自定义的 outputStream, 执行close()的时候对数据压缩,并输出
16     private GZipOutputStream gzipOutputStream;
17
18     // 自定义 printWriter,将内容输出到 GZipOutputStream 中
19     private PrintWriter writer;
20
21     public GZipResponseWrapper(HttpServletResponse response) throws IOException {
22         super(response);
23         this.response = response;
24     }
25
26     public ServletOutputStream getOutputStream() throws IOException {
27         if (gzipOutputStream == null)
28             gzipOutputStream = new GZipOutputStream(response);
29         return gzipOutputStream;
30     }
31
32     public PrintWriter getWriter() throws IOException {
33         if (writer == null)
34             writer = new PrintWriter(new OutputStreamWriter(
35                     new GZipOutputStream(response), "UTF-8"));
36         return writer;
37     }
38
39     // 压缩后数据长度会发生变化 因此将该方法内容置空
40     public void setContentLength(int contentLength) {
41     }
42
43     public void flushBuffer() throws IOException {
44         gzipOutputStream.flush();
45     }
46
47     public void finishResponse() throws IOException {
48         if (gzipOutputStream != null)
49             gzipOutputStream.close();
50         if (writer != null)
51             writer.close();
52     }
53 }

getWriter()与getOutputStream()都使用了GZipOutputStream类。这是自定义的一个ServletOutputStream类,它先将数据缓存起来,然后使用JDK自带的GZIP压缩类将数据压缩,并输出到客户端浏览器。GZIP数据压缩与输出都在该类里实现的。

GZipOutputStream.java

 1 package com.rom.util;
 2
 3 import java.io.ByteArrayOutputStream;
 4 import java.io.IOException;
 5 import java.util.zip.GZIPOutputStream;
 6
 7 import javax.servlet.ServletOutputStream;
 8 import javax.servlet.http.HttpServletResponse;
 9
10 public class GZipOutputStream extends ServletOutputStream {
11
12      private HttpServletResponse response;
13
14
15         private GZIPOutputStream gzipOutputStream;
16
17
18         private ByteArrayOutputStream byteArrayOutputStream;
19
20         public GZipOutputStream(HttpServletResponse response) throws IOException {
21             this.response = response;
22             byteArrayOutputStream = new ByteArrayOutputStream();
23             gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream);
24         }
25
26         public void write(int b) throws IOException {
27             gzipOutputStream.write(b);
28         }
29
30         public void close() throws IOException {
31
32
33             gzipOutputStream.finish();
34
35
36             byte[] content = byteArrayOutputStream.toByteArray();
37
38
39             response.addHeader("Content-Encoding", "gzip");
40             response.addHeader("Content-Length", Integer.toString(content.length));
41
42
43             ServletOutputStream out = response.getOutputStream();
44             out.write(content);
45             out.close();
46         }
47
48         public void flush() throws IOException {
49             gzipOutputStream.flush();
50         }
51
52         public void write(byte[] b, int off, int len) throws IOException {
53             gzipOutputStream.write(b, off, len);
54         }
55
56         public void write(byte[] b) throws IOException {
57             gzipOutputStream.write(b);
58         }
59
60 }

添加xml配置文件

1  <filter>
2   <display-name>GzipFilter</display-name>
3   <filter-name>GzipFilter</filter-name>
4   <filter-class>com.rom.util.GzipFilter</filter-class>
5 </filter>
6 <filter-mapping>
7   <filter-name>GzipFilter</filter-name>
8   <url-pattern>/*</url-pattern>
9 </filter-mapping>
时间: 2024-08-24 09:44:08

Gzip压缩优化网站的相关文章

13 nginx gzip压缩提升网站速度

一:nginx gzip压缩提升网站速度 我们观察news.163.com的头信息 请求: Accept-Encoding:gzip,deflate,sdch 响应: Content-Encoding:gzip Content-Length:36093 再把页面另存下来,观察,约10W字节,实际传输的36093字节 原因-------就在于gzip压缩上. 原理: 浏览器---请求----> 声明可以接受 gzip压缩 或 deflate压缩 或compress 或 sdch压缩 从http协议

Web服务器配置Gzip压缩提升网站性能

前言: HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术.大流量的WEB站点常常使用GZIP压缩技术来让用户感受更快的速度.这一般是指WWW服务器中安装的一个功能,当有人来访问这个服务器中的网站时,服务器中的这个功能就将网页内容压缩后传输到来访的电脑浏览器中显示出来.一般对纯文本内容可压缩到原大小的40%.这样传输就快了,效果就是你点击网址后会很快的显示出来.当然这也会增加服务器的负载. 一般服务器中都安装有这个功能模块的. 一.如何使用gzip gzip工作的原理很简单,通过

GZIP压缩优化

使用gzip优化web应用(filter实现) 相关知识: gzip是http协议中使用的一种加密算法,客户端向web服务器端发出了请求后,通常情况下服务器端会将页面文件和其他资源,返回到客户端,客户端加载后渲染呈现,这种情况文件一般都比较大,如果开启Gzip ,那么服务器端响应后,会将页面,JS,CSS等文本文件或者其他文件通过高压缩算法将其压缩,然后传输到客户端,由客户端的浏览器负责解压缩与呈现.通常能节省40%以上的流量(一般都有60%左右),一些PHP,JSP文件也能够进行压缩. 实  

2017年05月10日记一次微项目投产 | 安卓版微信内置浏览器不能解析gzip压缩过的mp4视频的问题

前言 今天投产了一个小项目,一个很简单的H5,有播放视频功能,使用了videojs插件. 之前也做过数个视频播放,视频的转压都按照既定流程进行,文件放到FTP后,iphone和安卓机测试下来都没有问题. 于是给链接,业务组直接在微信公众号里投放了.那个企业号有不少关注的人,推送发出去1分钟就有近千阅读量. 但是我在点击链接后,发现项目打不开了,而且该企业官网的主站也挂了,在经过pc端和手机4G下测试发现问题依然存在后,赶紧报bug给其他同事. 通过询问FTP管理员得知,那个"大"企业的

网站启用GZip压缩后,速度快了3倍!

GZip压缩,是一种网站速度优化技术,也是一把SEO优化利器,许多网站都采用了这种技术,以达到提升网页打开速度.缩短网页打开时间的目的. 本文是一篇研究性文章,将通过某个案例来给大家显示网站采用GZip压缩前后的对比效果. 这里将要研究的对象是园子的博客http://www.yzznl.cn/,该博客已经采用了GZip压缩技术.你可以通过这里进行GZip压缩检测. 下面将要进行的实验是该网站在采用与不采用GZip压缩的情况下网页打开的速度和时间的比较. 选择的测试工具是webkaka网站测速工具

nodejs+nginx配置gzip压缩

在个人网站部署到服务器的过程中,为了提高网站的性能,我使用了nginx反向代理Nodejs服务,其中需要去配置gzip来优化网站的加载.为了减少网络传输数据量,http传输过程中会采用通用的压缩算法来压缩数据,gzip属于最常用的压缩算法. 使用node的http模块发送请求时并没有帮我们进行解压,因此我们需要手动去判断gzip.其实只需要在Nodejs中引用一个compress中间件来对gzip进行处理就可以了,代码如下: var compress = require('compression

优化网站设计系列文章总结和导读

摘自:http://www.cnblogs.com/chenxizhang/archive/2013/05/20/3088196.html 概述 其实想写这方面的文章由来已久,这个系列文章的想法是参照雅虎团队提供的35条性能优化的最佳实践(其实最早的时候是14条),再结合我自己多年的实际工作经验,结合具体的开发平台(ASP.NET),为读者提供既有理论知识.又有实践指导的参考资料,对于优化而言,本身是一个长期细致的工作(没有所谓的银弹),并且重在权衡利弊,选择最适合自己项目情况的解决方案.而要达

ASP.NET MVC 3 网站优化总结(一) 使用 Gzip 压缩

网站开启 Gzip 压缩的好处相信很多人都已经清楚,这样做可以提高网站的性能.那么为什么很多网站没有开启 Gzip 压缩功能呢?原因有4点:防病毒软件.浏览器 bug.网站代理和服务器未配置. 使用 IE6 时不会发送 Accept-Encoding 请求头,这样就不支持 Gzip 压缩功能了,所以这里号召大家使用 Google Chrome.在 ASP.NET MVC 3 中我们通过实现 ActionFilter 来实现,如下: public class CompressAttribute :

网站访问优化(二):开启apache服务器gzip压缩

昨天,把带宽从1M升级到2M,使用cdn版本的jquery之后,网站访问速度由平均5s(在禁止缓存的情况下,使用缓存大概在2.8s)下降到2.8s的样子. 今天,继续优化. 第1步:   把图片进行了压缩,70kb以上的banner用的大图,压缩成50kb左右.图片质量稍微下降了一点,没钱连高清图片都用不起,所以还是得有钱,赚钱. 第2步:  js压缩. 昨天,也用了网上下载的js/css压缩器,部署时,用压缩版本的.速度并没有明显的提升,可能是因为js和css很少,而且都比较小的缘故. 晚上,