请教Content-accept encoding gzip中的gzip压缩

C#实现页面GZip或Deflate压缩的方法
作者:McJeremy&Fan
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了C#实现页面GZip或Deflate压缩的方法,涉及C#通过GZipStream与DeflateStream实现页面压缩的相关技巧,需要的朋友可以参考下
本文实例讲述了C#实现页面GZip或Deflate压缩的方法。分享给大家供大家参考。具体分析如下:
.NET Framework里
pression下有两个可用于页面压缩的类,GZipStream和 DeflateStream.
在页面被传输之前,需要获取发出请求的客户端所采用的解码形式。
可以通过Request.Headers["Accept-Encoding"]来获取。
在页面被压缩之前,需要获取页面实体主体,可通过
Response.Filter来获取(Stream类型)
示例代码:
using System.D
using System.C
using System.W
using System.Web.S
using System.Web.UI;
using System.Web.UI.WebC
using System.Web.UI.WebControls.WebP
using System.Web.UI.HtmlC
using System.IO;
/// &summary&
/// GzipDeflate 的摘要说明
/// &/summary&
public class GzipDeflate:IHttpModule
public GzipDeflate()
// TODO: 在此处添加构造函数逻辑
public void Init(HttpApplication app)
app.BeginRequest += new EventHandler(app_BeginRequest);
void app_BeginRequest(object sender, EventArgs e)
//HTTP头域可分为四类:通用头、请求头、响应头、实体头。
HttpApplication app=(HttpApplication)
string acceptEncoding = app.Request.Headers["Accept-Encoding"];
//客户端支持的解码方式。属于请求头。
Stream requestStream = app.Response.F
acceptEncoding = acceptEncoding.ToLower();
if(acceptEncoding.Contains("gzip"))
app.Response.Filter = new GZipStream(requestStream, press);
app.Response.AppendHeader("Content-Encoding", "gzip");
else if(acceptEncoding.Contains("deflate"))
app.Response.Filter = new DeflateStream(requestStream, press);
app.Response.AppendHeader("Content-Encoding", "deflate");
//属于实体头。
public void Dispose()
希望本文所述对大家的C#程序设计有所帮助。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具There are no accidents.
     GZIP压缩:将压缩后的文本文件,发送给浏览器,减少流量。
一、进行gzip压缩条件:
  1、请求头:Accept-Encoding : gzip& 告诉服务器,该浏览器支持gzip压缩。
  2、响应头:Content-Encoding : gzip.& 告诉浏览器,输出信息用gzip进行压缩了。
  3、两个主要类:
    ByteArrayOutputStream : 内存输出流,还有缓存。
    GZIPOutputStream 包装流;
二、gzip 压缩步骤:
    1、获取字符的字节数组 byte[] buf = str.getBytes() ;
    2、通过GZIPOutputStream 包装流进行输入:
     & 创建 GZIPOutputStream 输出流时,需要传一个带有缓冲区的输出流,所以我们ByteArrayOutputStream 输出流。而且,ByteArrayOutputStream还可以获取byte[];
    3、将ByteArrayOutputStream 流中的缓存数据,转换成字节数组。
    4、将 压缩后的字节数组通过response 进行输出。不过输出之前要设置Content-Encoding 响应头,value为gzip。告诉浏览器数据进行了gzip压缩,要使用gzip解压。
String str = "我是个测试";
//1\获取字节数组
byte[] bytes = str.getBytes() ;
System.out.println("压缩前的长度:" + bytes.length);
ByteArrayOutputStream baos = new ByteArrayOutputStream() ;
GZIPOutputStream
gzip = new GZIPOutputStream(baos) ;
gzip.write(bytes) ;
gzip.close() ;
bytes = baos.toByteArray() ;
System.out.println("压缩后的长度:" + bytes.length);
    数据较小是,压缩的效果不是很明显,不过数据越大,压缩效果越明显。所以,GZIP压缩一般只处理文本内容,对图片、已经压缩过的文件则不进行压缩。这时就要在配置文件时,配置要过滤的资源。
三、GZIPFilter
1 import itheima.decorator.MyHttpServletR
3 import java.io.ByteArrayOutputS
4 import java.io.IOE
5 import java.util.zip.GZIPOutputS
7 import javax.servlet.F
8 import javax.servlet.FilterC
9 import javax.servlet.FilterC
10 import javax.servlet.ServletE
11 import javax.servlet.ServletR
12 import javax.servlet.ServletR
13 import javax.servlet.http.HttpServletR
14 import javax.servlet.http.HttpServletR
* Gzip压缩过滤器
* @author 贺佐安
20 public class GZIPFilter implements Filter{
public void init(FilterConfig filterConfig) throws ServletException {
public void doFilter(ServletRequest req , ServletResponse resp ,
FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse)
HttpServletRequest request = (HttpServletRequest)
//创建HttpServletResponse 包装类的实例
MyHttpServletResponse myResponse = new MyHttpServletResponse(response) ;
chain.doFilter(request, myResponse) ;
//GZIP压缩:
byte[] buff = myResponse.getBufferedBytes() ;
//创建缓存容器:
ByteArrayOutputStream baos = new ByteArrayOutputStream() ;
GZIPOutputStream gzip = new GZIPOutputStream(baos) ;
gzip.write(buff) ;
gzip.close() ;
buff = baos.toByteArray() ;
//设置响应头;
response.setHeader("Content-Encoding", "gzip");
response.setContentLength(buff.length) ;
response.getOutputStream().write( buff) ;
public void destroy() {
  步骤:
    1、对HttpServletResponse 进行包装 :改写getOutputStream()、getWriter() 方法,并且设置一个临时容器,存储Serlvet处理后要输出的数据。 这里是重点。
1 import java.io.ByteArrayOutputS
2 import java.io.IOE
3 import java.io.OutputStreamW
4 import java.io.PrintW
6 import javax.servlet.ServletOutputS
7 import javax.servlet.http.HttpServletR
8 import javax.servlet.http.HttpServletResponseW
* 对HttpServletResponse 进行包装
* @author 贺佐安
14 public class MyHttpServletResponse extends HttpServletResponseWrapper {
//定义一个容器,用来存储Serlvet 处理完后response 写出的数据
private ByteArrayOutputStream bos = new ByteArrayOutputStream()
private PrintWriter printWriter = null;
public MyHttpServletResponse(HttpServletResponse
response) {
super(response) ;
//处理字节流输出的情况
public ServletOutputStream getOutputStream() throws IOException {
return new MyServletOutputStream(bos);
//处理字符流输出的情况:用字符流时要注意乱码:字节转字符要查码表,字符转字节也要查码表
public PrintWriter getWriter() throws IOException {
printWriter
= new PrintWriter(new OutputStreamWriter(bos, super.getCharacterEncoding())) ;
return printW
//获取response 写出的数据
public byte[] getBufferedBytes(){
if (printWriter != null)
printWriter.close() ;
bos.flush() ;
} catch (IOException e) {
e.printStackTrace();
byte[] byteArray = bos.toByteArray() ;
    2、改写getOutputStream 方法时,要返回一个SerlvetOutputStream 类实例,因为SerlvetOutputStream是抽象类,不能创建实例,所以要重写SerlvetOutputStream 类:
1 import java.io.ByteArrayOutputS
2 import java.io.IOE
4 import javax.servlet.ServletOutputS
* 包装ServletOutputStream ,改写write 方法。
* @author 贺佐安
10 public class MyServletOutputStream extends ServletOutputStream {
private ByteArrayOutputStream bos = null ;
public MyServletOutputStream (ByteArrayOutputStream bos) {
this.bos =
public void write(int b) throws IOException {
bos.write(b) ;
    3、将包装过的HttpServletResponse 类的实例放行。
    4、然后获取Servlet 处理过后的数据,然后进行Gzip压缩。
    5、调用ServletResponse 的实例,将压缩后的数据写出去。
//GZIP压缩:
byte[] buff = myResponse.getBufferedBytes() ;
//创建缓存容器:
ByteArrayOutputStream baos = new ByteArrayOutputStream() ;
GZIPOutputStream gzip = new GZIPOutputStream(baos) ;
gzip.write(buff) ;
gzip.close() ;
buff = baos.toByteArray() ;
//设置响应头;
response.setHeader("Content-Encoding", "gzip");
response.setContentLength(buff.length) ;
response.getOutputStream().write( buff) ;
  以上便是用Filter 对一些文本资源进行GIZP压缩的步骤。重点就是第二步,如何获取Servlet 返回的数据。更细一点的流程如下图:
&--------------------------------------------------------------------------------------------更新:日 22:34:54
阅读(...) 评论()网页优化工具
gzip压缩检测
PC浏览器↓
MSIE: Mozilla/4.0 ( Windows ...
Firefox: Mozilla/5.0 (W U; Windows ...
Opera: Opera/9.27 (Windows NT 5.2; U; ...
Safari: Mozilla/5.0 (W U; Windows ...
Chrome: Mozilla/5.0 (W U; Windows ...
手机浏览器↓
Android: Mozilla/5.0 (L U; Android 2.2;...
苹果iPhone: Mozilla/5.0 (iP U; CPU OS ...
QQ浏览器: Nokia/SymbianOS/9.1 ...
UC标准: NOKIA5700/UCWEB7.0.2.37/28/999 ...
的检测结果:
是否压缩是
压缩类型gzip
原文件大小8024 字节
压缩后文件大小3451 字节
压缩率56.99%
在您的网站上添加网站速度诊断链接:
QQ交流群()服务器使用Gzip压缩数据,加快网络传输(Java 例子)
服务器使用Gzip压缩数据,加快网络传输(Java 例子)
在我们的项目中,添加对gzip的支持,是为了加快数据在网络中的传输速度。
使用gzip,首先要设置请求消息头Accept-Encoding为gzip。这样,你将会得到一个响应,根据消息头Content-Encoding为gzip你可以知道,传输过来的数据是经过gzip压缩的。另外,消息头Content-Length会告诉你压缩后的数据长度。
&&&用Java实现的gzip
GetMethod&method&=&new&GetMethod(url);//生成一个get方法实例&&&&method.setQueryString(queryString);//设置查询字符串&&method.addRequestHeader(&Accept-Encoding&,&&gzip&);//设置接受响应消息为gzip&&&&HttpClient&client&=&new&HttpClient();//生成执行get方法的客户端实例&&client.executeMethod(method);//执行get方法&&&&InputStream&in&=&method.getResponseBodyAsStream();//获取响应消息体&&Header&contentEncoding&=&method.getResponseHeader(&Content-Encoding&);//获取消息头Content-Encoding判断数据流是否gzip压缩过&&&&if&(contentEncoding&!=&null&&&&contentEncoding.getValue().equalsIgnoreCase(&gzip&))&{&&&&&&GZIPInputStream&gzipIn&=&new&GZIPInputStream(in);&&&&&&int&len&=&Integer.parseInt(method.getResponseHeader(&Content-Length&).getValue());&&&&&&byte[]&b&=&new&byte[len];&&&&&&gzipIn.read(b);&&&&&&&&&&&&String&json&=&new&String(b);&&&&&&System.out.println(json);&&}&&
& 使用gzip在服务器端压缩数据的例子。
byte[]&result&=&data.getBytes(&UTF-8&);&&&&if(response.getHeader(&Accept-Encoding&).equalsIgnoreCase(&gzip&))&&{&&&&&&//&System.out.println(&Before&compression,&the&data&size&is&:&+&result.length);&&&&&&//&Using&gzip&compress&the&data&&&&&&ByteArrayOutputStream&out&=&new&ByteArrayOutputStream();&&&&&&GZIPOutputStream&gout&=&new&GZIPOutputStream(out);&&&&&&gout.write(json.getBytes(&UTF-8&));&&&&&&gout.close();&&&&&&result&=&out.toByteArray();&&&&&&&&//&System.out.println(&After&compression,&the&data&size&is&&+gzipResult.length);&&&&&&this.getResp().setHeader(&Content-Encoding&,&gzip&);&&&&&&this.getResp().setHeader(&Content-Length&,&result.length+&&);&&}&&&&response.getOutputStream().write(result);&&
我的热门文章
即使是一小步也想与你分享<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&}

我要回帖

更多关于 gzip contentlength 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信