在一些留言板、博客等项目中,用户发布的帖子可能文章内容太长。 此时,如果用户的互联网速度差或互联网不稳定,就会面临**响应太慢,发送失败的**情况。 如果网站有自动保存功能,这种情况会明显增加。 此时,只要在本地压缩并上传传输的内容,在服务器上解压缩,就可以处理长文本
实现构想
在前台以本地gzip格式在pako_deflate.js中压缩请求正文
在后台使用Java解压缩请求正文
操作环境
jdk 1.8.0_77
idea 2016.2.1
maven 3.3.9
项目依赖
公共端io-2.5 (简化io操作)
(json-lib-2.4 (处理请求正文中的参数) ) ) ) ) ) ) ) ) ) ) )。
spring-webmvc-4.3.4.RELEASE
pako_deflate-1.0.3.js(js文本压缩工具类) ) ) )。
JS压缩请求正文
因为只需在前台进行压缩,所以只需浏览pako的压缩专用文件pako_deflate.min.js即可
另外,我在项目中主要使用jQuery发送Ajax请求,所以要引入jQuery
将提交的参数转换为JSON字符串
var params=encodeuri component (JSON.stringify ({
标题: '标题',
content: '内容'
();
gip可以大幅压缩请求正文,但如果内容太小,压缩后的内容反而会变大,params.length测试对大于1000的文本可以达到60%以上的压缩效果,因此在压缩前需要判断内容
var params=encodeuri component (JSON.stringify ({
title: title,
内容:内容
();
varcompressbeginlen=params.length;
if(compressbeginlen1000 ) {
压缩JSON字符串
//Pako.gzip(Params )缺省情况下返回uint 8阵列对象。 此时,如果使用Ajax请求,参数将作为数组发送
//要解决此问题,请添加{to: 'string'}参数并返回二进制字符串
Params=Pako.gzip(Params,{to: 'string'};
}
$.Ajax({ ()
url: '/gzip ',
数据:参数、
dataType: 'text ',
类型: '开机自检',
headers: {
如果compressBeginLen大于1000,则标记此请求的参数使用gzip压缩
' content-encoding ' : params.length 1000? ' gzip': ' '
(,
success :功能(data ) {
//dosomething
}
() )
Java解压缩请求正文
首先,取得Content-Encoding请求头,根据该请求头的内容进行逻辑处理
@响应主体
@requestmapping(value='/gzip ' ) )。
公共字符串gzip (httpservletrequestrequest ) {
String params=' ';
try {
获取内容编码请求标头
stringcontentencoding=request.get header (content-encoding );
内容编码!=nullcontentencoding.equals (' gzip ' ) }{
//获取输入流
bufferedreaderreader=request.get reader (;
//将输入流中的请求实体转换为字节数组,并进行gzip解压缩
byte [ ] bytes=I outils.to bytearray (reader,' iso-8859-1 ' );
解压缩bytes序列
params=gzip util.uncompress (bytes );
} else {
bufferedreaderreader=request.get reader (;
params=Ioutils.tostring(reader );
}
if (参数!=null params.trim ().length ) )0) {
//前台对参数进行了url编码,所以在此进行解码
params=URL decoder.decode (params,' utf-8 ';
//将解码的参数转换为json对象
jsonobjectjson=JSON object.from object (params );
从json对象获取参数以进行后续操作
system.out.println (title : (t ) JSON.getstring ) title );
system.out.println (content : (t ' JSON.getstring ) content );
}
}catch(ioexceptione ) {
e .打印堆栈跟踪(;
}
返回参数;
}
//*
gzip格式的byte序列解压缩
* @param bytes gzip格式byte数组
* @param charset字符集
*/
publicstaticstringuncompress (byte [ ] bytes,String charset ) {
if (bytes==null|| bytes.length==0) ) )。
返回空值;
}
bytearrayoutputstreambytearrayoutputstream=null;
bytearrayinputstreambytearrayinputstream=null;
gipinputstreamgzipinputstream=null;
try {
bytearray output stream=newbytearrayoutputstream (;
bytearray inputstream=newbytearrayinputstream;
GIP inputstream=newgzipinputstream (字节输入);
使用//org.Apache.com mons.io.I outils简化流的操作
Ioutils.copy(gzipInputstream,byteArrayOutputStream );
returnbytearrayoutputstream.tostring (charset );
}catch(ioexceptione ) {
e .打印堆栈跟踪(;
} finally {
//释放流资源
I outils.close quietly (gzip inputstream;
I outils.close quietly (bytearray inputstream;
I outils.close quietly (bytearray output stream;
}
返回空值;
}
Jerry Qu还实现了一个服务器使用Node.js解压缩的DEMO,提供了deflate、zlib、gzip三种压缩、解压缩方式
上面的完整代码可以在gzip项目中引用