`

web中gzip,deflate的压缩与解压

    博客分类:
  • J2ee
阅读更多

一,对发送请求进行gzip,deflate压缩

1:gzip的情况

Sring url = "http://localhost/save";
PostMethod post = new PostMethod(url);
//请求体内容
String body = "sample";
//用gzip方式压缩请求体并赋给request
ByteArrayInputStream bis = new ByteArrayInputStream(body.getBytes());
ByteArrayOutputStream bos = new ByteArrayOutputStream();
GZIPOutputStream gos = new GZIPOutputStream(bos);
for (int c = bis.read(); c != -1; c = bis.read()) {
    gos.write(c);
}
gos.close();
InputStreamRequestEntity entity = new InputStreamRequestEntity(new ByteArrayInputStream(bos.toByteArray()), "text/html");
post.setRequestEntity(entity);
post.addRequestHeader("Content-Encoding", "gzip");

 

2:deflate的情况

Sring url = "http://localhost/save";
PostMethod post = new PostMethod(url);
//请求体内容
String body = "sample";
//用deflate方式压缩请求体并赋给request
ByteArrayInputStream bis = new ByteArrayInputStream(body.getBytes());
ByteArrayOutputStream bos = new ByteArrayOutputStream();
DeflaterOutputStream dos = new DeflaterOutputStream(bos);
for (int c = bis.read(); c != -1; c = bis.read()) {
    dos.write(c);
}
dos.close();
InputStreamRequestEntity entity = new InputStreamRequestEntity(new ByteArrayInputStream(bos.toByteArray()), "text/html");
post.setRequestEntity(entity);
post.addRequestHeader("Content-Encoding", "deflate");

 

二,在服务器端使用过滤器对压缩过的请求进行解压

新建一个filter继承UserAgentFilter.java,截取req,进行包装,接着继续执行别的filters

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException,
    ServletException {
    HttpServletRequest request = (HttpServletRequest) req;
    String ce = request.getHeader("Content-Encoding"); // gzip|deflate|inflate
    if (ce != null) {
        if (ce.indexOf("deflate") >= 0 || ce.indexOf("inflate") >= 0) {
	    // uncompress using inflate
	    request = new InflateRequestWrapper(request);
        } else if (ce.indexOf("gzip") >= 0) {
	    // uncompress using gzip
	    request = new GZipRequestWrapper(request);
        }
    }
    ......
    super.doFilter(request, res, chain);
    ......
}

 

下面是InflateRequestWrapper的内容,GZipRequestWrapper与之类似

public class InflateRequestWrapper extends HttpServletRequestWrapper {
    private BufferedServletInputStreamWrapper _stream;

    public InflateRequestWrapper(HttpServletRequest request) throws IOException {
        super(request);
        _stream = new BufferedServletInputStreamWrapper(new InflaterInputStream(request.getInputStream()), request.getContentLength());
    }

    @Override
    public BufferedServletInputStreamWrapper getInputStream() {
        return _stream;
    }

    @Override
    public int getContentLength() {
        return _stream.getBytes().length;
    }
}

 

下面是BufferedServletInputStreamWrapper的内容

public class BufferedServletInputStreamWrapper extends ServletInputStream {

    private static final int DEFAULT_READ_BUFFER_SIZE = 1024;
    private final byte[] EMPTY_ARRAY = new byte[0];
    private ByteArrayInputStream _is;
    private byte[] _bytes;

    /**
     * takes in the actual input stream that we should be buffering
     */
    public BufferedServletInputStreamWrapper(InflaterInputStream stream, int length) throws IOException {
        _bytes = (length == 0) ? EMPTY_ARRAY : toBytes(stream, length);
        _is = new ByteArrayInputStream(_bytes);
    }

    @Override
    public int read() throws IOException {
        return _is.read();
    }

    @Override
    public int read(byte[] buf,
                    int off,
                    int len) {
        return _is.read(buf, off, len);
    }

    @Override
    public int read(byte[] buf) throws IOException {
        return _is.read(buf);
    }

    @Override
    public int available() {
        return _is.available();
    }

    /**
     * resets the wrapper's stream so that it can be re-read from the stream. if we're
     * using this somewhere were we expect it to be done again in the chain this should
     * be called after we're through so we can reset the data.
     */

    public void resetWrapper() {
        _is = new ByteArrayInputStream(_bytes);
    }

    public byte[] getBytes() {
        return _bytes;
    }

    private byte[] toBytes(InputStream is, int bufferSize) throws IOException {
        bufferSize = (bufferSize <= 0) ? DEFAULT_READ_BUFFER_SIZE : bufferSize;
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        byte[] buffer = new byte[bufferSize];
        int read = is.read(buffer);

        while (-1 != read) {
            bos.write(buffer, 0, read);
            read = is.read(buffer);
        }

        return bos.toByteArray();
    }
}

 

三,服务器对response进行压缩可参考jetty相关源码

 

四,java客户端对压缩过的返回值进行解压

1,gzip的情况

GZIPInputStream gzip = new GZIPInputStream(post.getResponseBodyAsStream());
StringBuffer out = new StringBuffer();
byte[] b = new byte[4096];
for (int n; (n = gzip.read(b)) != -1;) {
    out.append(new String(b, 0, n));
}
return out.toString();

 

2,deflate的情况

InflaterInputStream iis = new InflaterInputStream(post.getResponseBodyAsStream());
contentLength = (contentLength <= 0) ? 1024 : contentLength;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buffer = new byte[contentLength];
int read = iis.read(buffer);

while (-1 != read) {
    bos.write(buffer, 0, read);
    read = iis.read(buffer);
}

byte[] _bytes = (contentLength == 0) ? EMPTY_ARRAY : bos.toByteArray();
ByteArrayInputStream _is = new ByteArrayInputStream(_bytes);

StringBuffer out = new StringBuffer();
byte[] b = new byte[4096];
for (int n; (n = _is.read(b)) != -1;) {
    out.append(new String(b, 0, n));
}
return out.toString();
 
1
0
分享到:
评论
2 楼 zhoulei984623 2011-03-21  
youfengkai 写道
客户端如何判断,该针对gzip还是deflate来解压呢?

对返回的头信息里面加上相应的标记
1 楼 youfengkai 2011-03-21  
客户端如何判断,该针对gzip还是deflate来解压呢?

相关推荐

    pako gzip 压缩和解压缩(支持中文)

    gzip是一种广泛使用的文件压缩格式,它基于deflate算法,并添加了额外的头部和尾部信息,以便于识别和解压。在JavaScript中,使用pako库进行gzip压缩和解压缩非常简单: 1. **压缩**:使用`pako.gzip()`方法,将未...

    利用JAVASCRIPT即你想那个GZIP压缩与解压缩

    标题中的“利用JAVASCRIPT实现GZIP压缩与解压缩”指的是在JavaScript环境中,我们可以使用原生或第三方库来处理GZIP格式的压缩和解压缩操作。GZIP是一种广泛使用的数据压缩格式,常用于减少网络传输的数据量,尤其是...

    C#实现页面GZip或Deflate压缩的方法

    在`GzipDeflate`类的`Init`方法中,我们为`HttpApplication`对象的`BeginRequest`事件注册了一个事件处理器。当每次有新的HTTP请求到达时,这个事件会被触发。 在`app_BeginRequest`事件处理器中,我们首先检查...

    ajax+pako.js实现gzip数据压缩上传,解决post数据过长问题

    pako.js是一个JavaScript实现的压缩库,提供了gzip和deflate等算法的压缩与解压功能。它轻量级且高效,适合在浏览器环境中使用。在我们的场景中,我们将用到它的gzip压缩功能。 以下是使用ajax和pako.js实现gzip...

    web的gzip解压代码

    在本主题中,我们将深入探讨如何在Web环境中对GZIP压缩格式的数据进行解压。 首先,我们要理解HTTP协议中的Content-Encoding头。当服务器发送GZIP压缩的响应时,会在HTTP头中包含`Content-Encoding: gzip`,告知...

    GZip流压缩&Web流压缩组件

    GZCore.dll gzip,deflate压缩/解压程序,使用前必须注册 GZUtil.dll GZCore.dll的缓冲区处理封装,用于Web的流处理,使用前必须注册 GZip4Web.dll 基于Web的压缩文件/流的传送,使用前必须注册 Test.zip 第一...

    PB_WebService中必用的压缩解压技术

    在PB中,可以使用第三方库或自定义函数来实现Deflate压缩和解压。 BZip2虽然压缩率较高,但相对Gzip来说,它的压缩和解压速度较慢。在对速度要求不高的场景下,BZip2可以提供更好的压缩效果。 Blob对象在PB中用于...

    javascript的gzip静态解压

    JavaScript的GZIP静态解压是Web开发中一个重要的技术话题,特别是在优化网页加载速度和减少网络传输数据量方面。GZIP是一种广泛使用的数据压缩算法,它可以在服务器端对HTML、CSS、JavaScript等文件进行压缩,然后在...

    最简单的gzip压缩

    在Linux和Unix系统中,gzip命令通常用于压缩单个文件,而tar命令则常与gzip一起使用,打包并压缩多个文件。 标题中的“最简单的gzip压缩”可能是指使用gzip命令行工具进行压缩的过程。在命令行界面,用户只需要输入...

    gzip解压和压缩,在内存使用

    gzip是一种广泛使用的数据压缩算法,尤其在Web服务中,它被用来减少数据传输量,从而提高网络传输效率和用户体验。本文将深入探讨gzip压缩和解压缩的原理、使用方法以及在HTTP中的应用。 gzip的核心是DEFLATE算法,...

    GZIP解压缩.rar

    GZIP不仅用于单个文件的压缩,也常用于HTTP请求和响应中的数据压缩,以提高Web应用的性能。 GZIP压缩算法基于DEFLATE,这是一种结合了LZ77(一种滑动窗口的无损数据压缩算法)和霍夫曼编码的方法。LZ77用于寻找重复...

    文件Gzip解压缩,vs

    Gzip是一种广泛使用的压缩格式,尤其在Web服务器和网络传输中。本文将深入探讨Gzip解压缩的相关知识点,以及如何在Visual Studio(VS)环境中进行操作。 ### 1. Gzip 压缩原理 Gzip,全称GNU zip,基于DEFLATE算法...

    Gzip压缩.docx

    在HTTP请求头中,客户端会声明自己支持的压缩格式,例如`Accept-Encoding: gzip, deflate`,表明它可以接收gzip和deflate压缩的数据。 2. 服务器接收到请求后,检测到`Accept-Encoding`头,就会对响应内容进行gzip...

    gzip压缩js,csss文件

    这两个.gz文件就是已经压缩过的版本,它们可以在Web服务器上使用,浏览器会自动解压。 不过,如果你有大量的js和css文件需要批量压缩,手动操作可能会比较繁琐。这时,你可以编写一个批处理脚本,或者使用一些自动...

    pako.js js Gzip 解压

    在IT行业中,数据压缩是一种常见的优化技术,用于减少网络传输的...了解如何使用pako.js进行Gzip解压是现代Web开发中的重要技能之一。通过合理的数据压缩和解压策略,我们可以提升应用的性能,提供更流畅的用户体验。

    使用GZip解压文件

    GZip是一种广泛使用的压缩格式,尤其在Web服务器和网络传输中扮演着重要角色。本篇文章将详细探讨如何使用GZip来解压文件,以及相关的文件和文件流操作。 首先,GZip是一种基于DEFLATE算法的压缩格式,它不仅能够...

    使用GZip解压缩文件.rar

    在IT行业中,压缩技术是日常工作中非常常见的工具,尤其是在数据传输...这个过程涉及创建和操作多个流,以及理解DEFLATE压缩算法的基本原理。了解这些概念和技巧对于任何进行数据压缩工作的开发者来说都是非常重要的。

    gzip.dll 网页数据压缩解压用

    gzip 是基于 DEFLATE 压缩算法的,DEFLATE 结合了 LZ77(Lempel-Ziv)算法和霍夫曼编码(Huffman Coding)。LZ77 算法用于查找文本中的重复模式并创建指向这些模式的引用,而霍夫曼编码则是一种无损数据压缩技术,它...

    java实现gzip ajax请求gzip压缩

    在IT行业中,gzip是一种广泛使用的数据压缩算法,尤其在Web服务中,用于减少网络传输的数据量,从而提高页面加载速度和降低服务器带宽消耗。Java作为后端开发的重要语言,支持处理gzip压缩,而Ajax(Asynchronous ...

    Java用GZIP压缩解压文件.zip

    在Java编程中,GZIP是一种常用的文件压缩格式,它基于DEFLATE算法,可以用于压缩和解压缩数据。本教程将深入探讨如何在Java中利用GZIP进行文件的压缩和解压缩操作。 首先,让我们了解Java中的GZIPOutputStream和...

Global site tag (gtag.js) - Google Analytics