`

Java压缩技术(五) GZIP相关——浏览器解析

阅读更多
昨天一篇GZIP相关实现引起大家的广泛关注,为一位朋友验证一下浏览器对gzip的支持情况,才有此文!

相关链接:
Java压缩技术(一) ZLib
Java压缩技术(二) ZIP压缩——Java原生实现
Java压缩技术(三) ZIP解压缩——Java原生实现
Java压缩技术(四) GZIP——Java原生实现
Java压缩技术(五) GZIP相关——浏览器解析
Java压缩技术(六) BZIP2——Commons实现
Java压缩技术(七) TAR——Commons实现

GZIP本身就是一种网络流压缩算法,而且应用相当广泛。如果网络访问过程中,其数据流较大,势必降低网络访问效率,此时就需要考虑使用压缩!当然,在浏览器与服务器的交互中,要考虑浏览器是否支持这些算法,以及服务器运行压缩所带来的负载。如果你关注浏览器上传的“Accept-Encoding”属性,你就能看明白这一点。

GZIP如何压缩,我这里就不废话了,不清楚的朋友请关注(Java压缩技术(四) GZIP——Java原生实现
至于如何使得服务器支持gzip的流输出,关键点只有一行代码:
	response.setHeader("Content-Encoding", "gzip");

经过这项设置,浏览器就能够很好的作出响应!
先看FireFox,如图:

再看Opera,如图:

浏览器在打开该页面时,就可解压获得并展示其内容!
至于IE就惨了,愣是要求下载! 可能缺少什么设置!(注意后续服务器配置! 不是无解哦!)
你不信就这么简单?上代码!
/**
 * 2010-4-14
 */
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.zip.GZIPOutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * GZip服务
 * 
 * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a>
 * @since 1.0
 */
public class GZipServlet extends HttpServlet {

	private static final long serialVersionUID = -4811926975427533081L;
	private static final String ENCODING = "UTF-8";

	/**
	 * 压缩
	 * 
	 * @param data
	 * @return
	 * @throws Exception
	 */
	private byte[] compress(byte[] data) throws Exception {

		ByteArrayOutputStream baos = new ByteArrayOutputStream();

		// 压缩
		GZIPOutputStream gos = new GZIPOutputStream(baos);

		gos.write(data, 0, data.length);

		gos.finish();

		byte[] output = baos.toByteArray();

		baos.flush();
		baos.close();

		return output;
	}

	/**
	 * @param request
	 * @param response
	 * @throws ServletException
	 * @throws IOException
	 */
	private void excute(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		byte[] data = "我是一个中国人!".getBytes(ENCODING);

		try {
			byte[] output = compress(data);

			// 设置Content-Encoding,这是关键点!
			response.setHeader("Content-Encoding", "gzip");
			// 设置字符集
			response.setCharacterEncoding(ENCODING);
			// 设定输出流中内容长度
			response.setContentLength(output.length);

			OutputStream out = response.getOutputStream();
			out.write(output);
			out.flush();
			out.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		excute(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		excute(request, response);
	}

}

其实,就这些内容!

当然,除了上述代码方式,针对于tomcat可以通过修改配置获得支持!

 <Connector 
               port="8080" 
               protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="443" 
               URIEncoding="UTF-8"
               compression="on"   
               noCompressionUserAgents="gozilla, traviata"   
               compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,application/json" 
 />  

说说配置细节:
compression="on"   开启压缩支持
noCompressionUserAgents="gozilla, traviata"   不压缩的内容
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,application/json" 压缩的类型

至于代码,你无需写一行代码!轻松获得服务器访问加速! 并且IE也支持哦!

借网友经验,如下实现,轻松获得IE支持:
response.setContentType("text/plain;charset=utf-8"); 


工程在我的附件里,请下载验证!

相关链接:
Java压缩技术(一) ZLib
Java压缩技术(二) ZIP压缩——Java原生实现
Java压缩技术(三) ZIP解压缩——Java原生实现
Java压缩技术(四) GZIP——Java原生实现
Java压缩技术(五) GZIP相关——浏览器解析
Java压缩技术(六) BZIP2——Commons实现
Java压缩技术(七) TAR——Commons实现
  • 大小: 31.9 KB
  • 大小: 19.4 KB
10
6
分享到:
评论
11 楼 chenghm123 2014-08-30  
今天一天在你的微博上找到了两个我研究了好长时间的问题、网上各种资料水分太多、本来以为我是爱计算机的人、看到你的微博我才知道、你这样的人才是真正对计算机有着热爱、我觉得这样的人没有理由不成功、加油!
10 楼 snowolf 2013-12-03  
JavaCrazyer 写道
经过试验,不存在你所说的IE提示下载的情况,火狐和IE则是容易出现乱码,代码中添加一句:response.setContentType("text/plain;charset=utf-8"); 即可解决

OK,吸收掉~
9 楼 JavaCrazyer 2013-12-02  
经过试验,不存在你所说的IE提示下载的情况,火狐和IE则是容易出现乱码,代码中添加一句:response.setContentType("text/plain;charset=utf-8"); 即可解决
8 楼 atealxt 2011-01-16  
使用gzip filter,遇到过如下问题:
压缩流文件用servlet推到浏览器端,下载进度条显示不正确
至今未解决,只好先不压缩流文件了
7 楼 snowolf 2010-04-17  
SeanHe 写道
snowolf 写道
SeanHe 写道
oscache 里有gzip filter

就是喜欢JavaEye,高手云集!有简单的介绍吗?来个url也成!

oscache的文档忘记在哪里了
以前我用过ehcache用法很简单请看这个文档http://ehcache.org/documentation/web_caching.html

下次整理缓存技术的时候,我可以深入研究一下!THX!
6 楼 SeanHe 2010-04-17  
snowolf 写道
SeanHe 写道
oscache 里有gzip filter

就是喜欢JavaEye,高手云集!有简单的介绍吗?来个url也成!

oscache的文档忘记在哪里了
以前我用过ehcache用法很简单请看这个文档http://ehcache.org/documentation/web_caching.html
5 楼 iamzealotwang 2010-04-14  
   谢谢 很受教 呵呵.
4 楼 snowolf 2010-04-14  
wpfwupengfeiwpf 写道
呵呵,恕我愚钝,看不出private byte[] compress(byte[] data)方法中 ByteArrayInputStream bais = new ByteArrayInputStream这句的作用

是我笔误,已修正,多谢提点!
3 楼 wpfwupengfeiwpf 2010-04-14  
呵呵,恕我愚钝,看不出private byte[] compress(byte[] data)方法中 ByteArrayInputStream bais = new ByteArrayInputStream这句的作用
2 楼 snowolf 2010-04-14  
SeanHe 写道
oscache 里有gzip filter

就是喜欢JavaEye,高手云集!有简单的介绍吗?来个url也成!
1 楼 SeanHe 2010-04-14  
oscache 里有gzip filter

相关推荐

    java压缩技术

    ZLib ZIP 压缩——Java 原生实现 ZIP 解压缩——Java 原生实现 GZIP——Java 原生实现 GZIP 相关——浏览器解析 BZIP2——Commons 实现 TAR——Commons 实现

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

    摘要:Java源码,网络相关,浏览器  Java编写的HTML浏览器源代码,一个很简单甚至不算是浏览器的HTML浏览器,使用方法:  可直接输入文件名或网络地址,但必需事先连入网络。 Java编写的山寨QQ,多人聊天+用户在线 ...

    JAVA上百实例源码以及开源项目源代码

    摘要:Java源码,网络相关,浏览器  Java编写的HTML浏览器源代码,一个很简单甚至不算是浏览器的HTML浏览器,使用方法:  可直接输入文件名或网络地址,但必需事先连入网络。 Java编写的山寨QQ,多人聊天+用户在线 ...

    JAVA上百实例源码以及开源项目

    摘要:Java源码,网络相关,浏览器  Java编写的HTML浏览器源代码,一个很简单甚至不算是浏览器的HTML浏览器,使用方法:  可直接输入文件名或网络地址,但必需事先连入网络。 Java编写的山寨QQ,多人聊天+用户在线 ...

    java源码包4

    摘要:Java源码,网络相关,浏览器  Java编写的HTML浏览器源代码,一个很简单甚至不算是浏览器的HTML浏览器,使用方法:  可直接输入文件名或网络地址,但必需事先连入网络。 Java编写的山寨QQ,多人聊天+用户在线...

    java源码包3

    摘要:Java源码,网络相关,浏览器  Java编写的HTML浏览器源代码,一个很简单甚至不算是浏览器的HTML浏览器,使用方法:  可直接输入文件名或网络地址,但必需事先连入网络。 Java编写的山寨QQ,多人聊天+用户在线...

    java源码包2

    摘要:Java源码,网络相关,浏览器  Java编写的HTML浏览器源代码,一个很简单甚至不算是浏览器的HTML浏览器,使用方法:  可直接输入文件名或网络地址,但必需事先连入网络。 Java编写的山寨QQ,多人聊天+用户在线...

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

    Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密 Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。 设定字符串为“张三,你好,我是李四”...

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

    Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密 Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。 设定字符串为“张三,你好,我是李四”...

Global site tag (gtag.js) - Google Analytics