`

【转】Java 高性能Web 开发(5)-GZIP 压缩

 
阅读更多

为了减少传输的数据,压缩是一个不错的选择,而 HTTP 协议支持 GZIP 的压缩格式,服务器响应的报头包含 Content-Encoding: gzip,它告诉浏览器,这个响应的返回数据,已经压缩成 GZIP 格式,浏览器获得数据后要进行解压缩操作。这在一定程度可以减少服务器传输的数据,提高系统性能。那么如何给服务器响应添加 Content-Encoding: gzip 报头,同时压缩响应数据呢?如果你用的是 Tomcat 服务器,打开 $tomcat_home$/conf/server.xml 文件,对 Connector 进行配置,配置如清单 8 所示。

清单 8. TOMCAT 配置清单

<Connector  port ="80"  maxHttpHeaderSize ="8192" 
 maxThreads ="150"  minSpareThreads ="25"  maxSpareThreads ="75" 
 enableLookups ="false"  redirectPort ="8443"  acceptCount ="100" 
 connectionTimeout ="20000"  disableUploadTimeout ="true"  URIEncoding ="utf-8"   
 compression="on" 
 compressionMinSize="2048" 
 noCompressionUserAgents="gozilla, traviata" 
 compressableMimeType="text/html,text/xml" />

 我们为 Connector 添加了如下几个属性,他们意义分别是:

 

compression="on" 打开压缩功能

 

compressionMinSize="2048" 启用压缩的输出内容大小,这里面默认为 2KB

 

noCompressionUserAgents="gozilla, traviata" 对于以下的浏览器,不启用压缩

 

compressableMimeType="text/html,text/xml, image/png" 压缩类型

 

有时候,我们无法配置 server.xml,比如如果我们只是租用了别人的空间,但是它并没有启用 GZIP,那么我们就要使用程序启用 GZIP 功能。我们将需要压缩的文件,放到指定的文件夹,使用一个过滤器,过滤对这个文件夹里文件的请求。

清单 9. 自定义 Filter 压缩 GZIP

// 监视对 gzipCategory 文件夹的请求
 @WebFilter(urlPatterns = { "/gzipCategory/*" }) 
 public class GZIPFilter implements Filter { 

 @Override 
 public void doFilter(ServletRequest request, ServletResponse response, 
 FilterChain chain) throws IOException, ServletException { 
 String parameter = request.getParameter("gzip"); 
 // 判断是否包含了 Accept-Encoding 请求头部
 HttpServletRequest s = (HttpServletRequest)request; 
 String header = s.getHeader("Accept-Encoding"); 
 //"1".equals(parameter) 只是为了控制,如果传入 gzip=1,才执行压缩,目的是测试用
 if ("1".equals(parameter) && header != null && header.toLowerCase().contains("gzip")) { 
 HttpServletResponse resp = (HttpServletResponse) response; 
 final ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 

 HttpServletResponseWrapper hsrw = new HttpServletResponseWrapper( 
 resp) { 

 @Override 
 public PrintWriter getWriter() throws IOException { 
 return new PrintWriter(new OutputStreamWriter(buffer, 
 getCharacterEncoding())); 
 } 

 @Override 
 public ServletOutputStream getOutputStream() throws IOException { 
 return new ServletOutputStream() { 

 @Override 
 public void write(int b) throws IOException { 
 buffer.write(b); 
 } 
 }; 
 } 

 }; 

 chain.doFilter(request, hsrw); 
 byte[] gzipData = gzip(buffer.toByteArray()); 
 resp.addHeader("Content-Encoding", "gzip"); 
 resp.setContentLength(gzipData.length); 
 ServletOutputStream output = response.getOutputStream(); 
 output.write(gzipData); 
 output.flush(); 
 } else { 
 chain.doFilter(request, response); 
 } 
 } 
 // 用 GZIP 压缩字节数组
 private byte[] gzip(byte[] data) { 
 ByteArrayOutputStream byteOutput = new ByteArrayOutputStream(10240); 
 GZIPOutputStream output = null; 
 try { 
 output = new GZIPOutputStream(byteOutput); 
 output.write(data); 
 } catch (IOException e) { 
 } finally { 
 try { 
 output.close(); 
 } catch (IOException e) { 
 } 
 } 
 return byteOutput.toByteArray(); 
 } 
……
 }

 该程序的主体思想,是在响应流写回之前,对响应的字节数据进行 GZIP 压缩,因为并不是所有的浏览器都支持 GZIP 解压缩,如果浏览器支持 GZIP 解压缩,会在请求报头的 Accept-Encoding 里包含 gzip。这是告诉服务器浏览器支持 GZIP 解压缩,因此如果用程序控制压缩,为了保险起见,还需要判断浏览器是否发送 accept-encoding: gzip 报头,如果包含了该报头,才执行压缩。为了验证压缩前后的情况,使用 Firebug 监控请求和响应报头。

清单 10. 压缩前请求

GET /testProject/gzipCategory/test.html HTTP/1.1 
 Accept: */* 
 Accept-Language: zh-cn 
 Accept-Encoding: gzip, deflate 
 User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) 
 Host: localhost:9090 
 Connection: Keep-Alive

 清单 11. 不压缩的响应

HTTP/1.1 200 OK 
 Server: Apache-Coyote/1.1 
 ETag: W/"5060-1242444154000"
 Last-Modified: Sat, 16 May 2009 03:22:34 GMT 
 Content-Type: text/html 
 Content-Length: 5060
 Date: Mon, 18 May 2009 12:29:49 GMT 

 清单 12. 压缩后的响应

HTTP/1.1 200 OK 
 Server: Apache-Coyote/1.1 
 ETag: W/"5060-1242444154000"
 Last-Modified: Sat, 16 May 2009 03:22:34 GMT 
 Content-Encoding: gzip
 Content-Type: text/html 
 Content-Length: 837
 Date: Mon, 18 May 2009 12:27:33 GMT 

 可以看到,压缩后的数据比压缩前数据小了很多。压缩后的响应报头包含 Content-Encoding: gzip。同时 Content-Length 包含了返回数据的大小。GZIP 压缩是一个重要的功能,前面提到的是对单一服务器的压缩优化,在高并发的情况,多个 Tomcat 服务器之前,需要采用反向代理的技术,提高并发度,而目前比较火的反向代理是 Nginx(这在后续的文章会进行详细的介绍)。对 Nginx HTTP 配置部分里增加如下配置。

清单 13. Nginx GZIP 配置

gzip  on; 
 gzip_min_length  1000; 
 gzip_buffers     4 8k; 
 gzip_types       text/plain application/x-javascript text/css text/html application/xml; 

 由于 Nginx 具有更高的性能,利用该配置可以更好的提高性能。在高性能服务器上该配置将非常有用。

原创文章@java教程网 转载请标明出处

java教程网编辑发布:希望本系列的文章对你的个人成长和发展有帮助。

java新手入门,开发工具 Java进阶,高级编程,java教程网几乎囊括了java编程的所有方面的资料

分享到:
评论

相关推荐

    Java压缩技术(四) GZIP——Java原生实现

    同时,了解GZIP压缩的基本原理和Java的实现方式,有助于优化代码性能,例如在处理大数据时,可以考虑使用缓冲区来提高效率。 总的来说,Java提供的GZIP压缩功能是强大且易用的,`GZipUtils`类的实现可以帮助我们更...

    gzip java ajax

    综上所述,gzip在Java和AJAX开发中起到关键作用,它能有效提高Web应用的性能,降低网络延迟。理解并正确使用gzip,对于优化Web服务和提升用户体验至关重要。同时,通过合理配置和使用gzip,可以在不牺牲用户体验的...

    java源码包---java 源码 大量 实例

     用JAVA开发的一个小型的目录监视系统,系统会每5秒自动扫描一次需要监视的目录,可以用来监视目录中文件大小及文件增减数目的变化。 Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历,...

    Java Web之高级应用

    - Tomcat服务器的配置优化、GZIP压缩和负载均衡也是提升Web应用性能的关键。 9. **安全性** - SSL/TLS协议用于加密Web通信,防止数据被窃取。 - OWASP(Open Web Application Security Project)提供了一系列...

    高性能页面加载技术--BigPipe设计原理及Java简单实现

    高性能页面加载技术是现代Web开发中的重要议题,旨在提升用户体验,减少用户等待时间。BigPipe是一种由Facebook提出的高效页面加载策略,它通过将一个页面拆分成多个部分(或称为“管道”),并逐个异步加载这些部分...

    java web开发技术方案宝典/4-6.rar

    【标题】"java web开发技术方案宝典/4-6.rar"揭示了这是一份关于Java Web开发的综合教程,涵盖了第四至第六部分的内容。在Java Web开发领域,这一宝典可能包含了诸如Servlet、JSP、JavaServer Faces (JSF)、Spring ...

    nginx高性能web服务器详解

    **Nginx高性能Web服务器详解** Nginx是一款开源、高性能、轻量级的Web服务器/反向代理服务器,广泛应用于互联网和企业级应用中。它的设计目标是高并发、低内存占用,使得Nginx在处理静态内容和作为反向代理时表现...

    netty对象传输gzipdemo

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在“netty对象传输gzipdemo”中,我们关注的是如何使用Netty来传输对象,并且利用gzip进行数据压缩,以提高...

    几种无损数据压缩算法的探讨及在java web程序中的应用.pdf

    无损数据压缩算法是计算机科学中的重要组成部分,主要用于在不损失任何信息的前提下,减少数据所占的空间,以达到...在Java Web程序中,GZIP压缩作为一种常见的数据传输优化手段,有助于减少网络负载,提升系统性能。

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java目录监视器源程序 9个目标文件 内容索引:JAVA源码,综合应用,目录监视 用JAVA开发的一个小型的目录监视系统,系统会每5秒自动扫描一次需要监视的目录,可以用来监视目录中文件大小及文件增减数目的变化。...

    高性能、简洁优雅的 Web 框架.zip

    【高性能、简洁优雅的Web框架】是一个以Java8为基础,注重高性能和代码简洁性的MVC框架,名为Blade。这个开源项目旨在为开发者提供一种快速开发Web应用的工具,其设计哲学是简单、轻量且高效。下面我们将深入探讨...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Java目录监视器源程序 9个目标文件 内容索引:JAVA源码,综合应用,目录监视 用JAVA开发的一个小型的目录监视系统,系统会每5秒自动扫描一次需要监视的目录,可以用来监视目录中文件大小及文件增减数目的变化。...

    java数据压缩传输

    Java标准库中的`java.util.zip`包提供了`GZIPOutputStream`和`GZIPInputStream`类,它们实现了广泛使用的Gzip压缩算法。Gzip是一种高效的压缩格式,常用于文件传输。以下是如何使用这两个类进行数据压缩和解压缩的...

    JAVA文件压缩与解压缩实践(源代码+论文).rar

    例如,Web服务器可能会使用GZIP压缩HTTP响应以提高传输效率。 6. **注意事项**:在处理压缩文件时,需要注意错误处理,比如文件不存在、内存不足或压缩格式不支持等问题。此外,考虑到安全性,应避免压缩敏感或私密...

    tomcat设置gzip压缩共2页.pdf.zip

    在Tomcat中启用Gzip压缩可以优化Web应用的性能,尤其对于那些包含大量文本内容的网页。 Tomcat设置Gzip压缩涉及到以下几个关键知识点: 1. **Gzip压缩原理**:Gzip通过查找和替换重复的数据序列来减小文件大小。它...

    MiGz是一个多线程gzip兼容的压缩和解压缩可作为Java库和命令行工具

    总的来说,MiGz是Java开发中一个强大的压缩和解压缩工具,它通过多线程处理和gzip兼容性,为开发者提供了更高效、更灵活的数据压缩解决方案。无论是用于开发还是运维,MiGz都能成为提高工作效率的好帮手。如果你的...

    java server-jre-8u60-windows-x64.gz

    2. **Server JRE**:与标准版JRE相比,Server JRE更侧重于服务器端的性能和稳定性,通常用于运行高性能、高并发的Java应用,如Web服务器、应用服务器等。它去除了图形用户界面相关的组件,以减少内存占用并提升运行...

    mycat-web.zip

    该文件是一个tar归档并进行了gzip压缩的文件,解压后将包含mycat-web的服务器端运行所需的所有文件,包括配置文件、启动脚本等。用户可以在Linux环境中通过命令行执行解压后的启动脚本来运行mycat-web服务。 2. **...

    DivCss网页布局和高性能Web站点

    网页布局和高性能Web站点是现代互联网开发中的关键领域。DivCSS,全称为“层叠样式表(Cascading Style Sheets)”,是用于控制网页元素样式和布局的主要技术。DivCSS布局利用HTML的div标签,结合CSS,实现了内容与...

Global site tag (gtag.js) - Google Analytics