为了减少传输的数据,压缩是一个不错的选择,而 HTTP 协议支持 GZIP 的压缩格式,服务器响应的报头包含 Content-Encoding: gzip,它告诉浏览器,这个响应的返回数据,已经压缩成 GZIP 格式,浏览器获得数据后要进行解压缩操作。这在一定程度可以减少服务器传输的数据,提高系统性能。那么如何给服务器响应添加 Content-Encoding: gzip 报头,同时压缩响应数据呢?如果你用的是 Tomcat 服务器,打开 $tomcat_home$/conf/server.xml 文件,对 Connector 进行配置,配置如清单 8 所示。
<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 功能。我们将需要压缩的文件,放到指定的文件夹,使用一个过滤器,过滤对这个文件夹里文件的请求。
// 监视对 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 监控请求和响应报头。
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
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
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 配置部分里增加如下配置。
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编程的所有方面的资料
相关推荐
同时,了解GZIP压缩的基本原理和Java的实现方式,有助于优化代码性能,例如在处理大数据时,可以考虑使用缓冲区来提高效率。 总的来说,Java提供的GZIP压缩功能是强大且易用的,`GZipUtils`类的实现可以帮助我们更...
综上所述,gzip在Java和AJAX开发中起到关键作用,它能有效提高Web应用的性能,降低网络延迟。理解并正确使用gzip,对于优化Web服务和提升用户体验至关重要。同时,通过合理配置和使用gzip,可以在不牺牲用户体验的...
用JAVA开发的一个小型的目录监视系统,系统会每5秒自动扫描一次需要监视的目录,可以用来监视目录中文件大小及文件增减数目的变化。 Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历,...
- Tomcat服务器的配置优化、GZIP压缩和负载均衡也是提升Web应用性能的关键。 9. **安全性** - SSL/TLS协议用于加密Web通信,防止数据被窃取。 - OWASP(Open Web Application Security Project)提供了一系列...
高性能页面加载技术是现代Web开发中的重要议题,旨在提升用户体验,减少用户等待时间。BigPipe是一种由Facebook提出的高效页面加载策略,它通过将一个页面拆分成多个部分(或称为“管道”),并逐个异步加载这些部分...
【标题】"java web开发技术方案宝典/4-6.rar"揭示了这是一份关于Java Web开发的综合教程,涵盖了第四至第六部分的内容。在Java Web开发领域,这一宝典可能包含了诸如Servlet、JSP、JavaServer Faces (JSF)、Spring ...
**Nginx高性能Web服务器详解** Nginx是一款开源、高性能、轻量级的Web服务器/反向代理服务器,广泛应用于互联网和企业级应用中。它的设计目标是高并发、低内存占用,使得Nginx在处理静态内容和作为反向代理时表现...
Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在“netty对象传输gzipdemo”中,我们关注的是如何使用Netty来传输对象,并且利用gzip进行数据压缩,以提高...
无损数据压缩算法是计算机科学中的重要组成部分,主要用于在不损失任何信息的前提下,减少数据所占的空间,以达到...在Java Web程序中,GZIP压缩作为一种常见的数据传输优化手段,有助于减少网络负载,提升系统性能。
Java目录监视器源程序 9个目标文件 内容索引:JAVA源码,综合应用,目录监视 用JAVA开发的一个小型的目录监视系统,系统会每5秒自动扫描一次需要监视的目录,可以用来监视目录中文件大小及文件增减数目的变化。...
【高性能、简洁优雅的Web框架】是一个以Java8为基础,注重高性能和代码简洁性的MVC框架,名为Blade。这个开源项目旨在为开发者提供一种快速开发Web应用的工具,其设计哲学是简单、轻量且高效。下面我们将深入探讨...
Java目录监视器源程序 9个目标文件 内容索引:JAVA源码,综合应用,目录监视 用JAVA开发的一个小型的目录监视系统,系统会每5秒自动扫描一次需要监视的目录,可以用来监视目录中文件大小及文件增减数目的变化。...
Java标准库中的`java.util.zip`包提供了`GZIPOutputStream`和`GZIPInputStream`类,它们实现了广泛使用的Gzip压缩算法。Gzip是一种高效的压缩格式,常用于文件传输。以下是如何使用这两个类进行数据压缩和解压缩的...
例如,Web服务器可能会使用GZIP压缩HTTP响应以提高传输效率。 6. **注意事项**:在处理压缩文件时,需要注意错误处理,比如文件不存在、内存不足或压缩格式不支持等问题。此外,考虑到安全性,应避免压缩敏感或私密...
在Tomcat中启用Gzip压缩可以优化Web应用的性能,尤其对于那些包含大量文本内容的网页。 Tomcat设置Gzip压缩涉及到以下几个关键知识点: 1. **Gzip压缩原理**:Gzip通过查找和替换重复的数据序列来减小文件大小。它...
总的来说,MiGz是Java开发中一个强大的压缩和解压缩工具,它通过多线程处理和gzip兼容性,为开发者提供了更高效、更灵活的数据压缩解决方案。无论是用于开发还是运维,MiGz都能成为提高工作效率的好帮手。如果你的...
2. **Server JRE**:与标准版JRE相比,Server JRE更侧重于服务器端的性能和稳定性,通常用于运行高性能、高并发的Java应用,如Web服务器、应用服务器等。它去除了图形用户界面相关的组件,以减少内存占用并提升运行...
该文件是一个tar归档并进行了gzip压缩的文件,解压后将包含mycat-web的服务器端运行所需的所有文件,包括配置文件、启动脚本等。用户可以在Linux环境中通过命令行执行解压后的启动脚本来运行mycat-web服务。 2. **...
网页布局和高性能Web站点是现代互联网开发中的关键领域。DivCSS,全称为“层叠样式表(Cascading Style Sheets)”,是用于控制网页元素样式和布局的主要技术。DivCSS布局利用HTML的div标签,结合CSS,实现了内容与...