HTTP協定上的GZIP編碼是一種用來改進WEB應用程式性能的技術。大流量的WEB站點常常使用GZIP壓縮技術來讓使用者感受更快的速度。這一般是指WWW伺服器中安裝的一個功能,當有人來通路這個伺服器中的網站時,伺服器中的這個功能就将網頁内容壓縮後傳輸到來訪的電腦浏覽器中顯示出來.一般對純文字内容可壓縮到原大小的40%.這樣傳輸就快了,效果就是你點選網址後會很快的顯示出來.當然這也會增加伺服器的負載. 一般伺服器中都安裝有這個功能子產品的。
1.Tomcat啟用Gzip壓縮。
要使用gzip壓縮功能,可以在Connector執行個體中加上如下屬性:
1) compression=”on” 打開壓縮功能
2) compressionMinSize=”2048” 啟用壓縮的輸出内容大小,這裡面預設為2KB
3) noCompressionUserAgents=”gozilla, traviata” 對于以下的浏覽器,不啟用壓縮&<60;
4) compressableMimeType=”text/html,text/xml” 壓縮類型
故将原始代碼
<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
<Connector port="8080" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" />
變換為:
<Connector port="8080" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" compression="on"
compressionMinSize="2048" noCompressionUserAgents="gozilla,traviata"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" />
即可被可以解析Gzip的浏覽器通過Gzip通路。
2.在代碼中實作Gzip壓縮。
添加GzipUtil,使用相應的方法即可。
package com.yundong.api.util;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
/**
* GZIP工具
*
* @author <a href="mailto:[email protected]" target="_blank" rel="external nofollow" >梁棟</a>
* @since 1.0
*/
public abstract class GzipUtil {
public static final int BUFFER = ;
public static final String EXT = ".gz";
/**
* 資料壓縮
*
* @param data
* @return
* @throws Exception
*/
public static byte[] compress(byte[] data) throws Exception {
ByteArrayInputStream bais = new ByteArrayInputStream(data);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 壓縮
compress(bais, baos);
byte[] output = baos.toByteArray();
baos.flush();
baos.close();
bais.close();
return output;
}
/**
* 檔案壓縮
*
* @param file
* @throws Exception
*/
public static void compress(File file) throws Exception {
compress(file, true);
}
/**
* 檔案壓縮
*
* @param file
* @param delete
* 是否删除原始檔案
* @throws Exception
*/
public static void compress(File file, boolean delete) throws Exception {
FileInputStream fis = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream(file.getPath() + EXT);
compress(fis, fos);
fis.close();
fos.flush();
fos.close();
if (delete) {
file.delete();
}
}
/**
* 資料壓縮
*
* @param is
* @param os
* @throws Exception
*/
public static void compress(InputStream is, OutputStream os)
throws Exception {
GZIPOutputStream gos = new GZIPOutputStream(os);
int count;
byte data[] = new byte[BUFFER];
while ((count = is.read(data, , BUFFER)) != -) {
gos.write(data, , count);
}
gos.finish();
gos.flush();
gos.close();
}
/**
* 檔案壓縮
*
* @param path
* @throws Exception
*/
public static void compress(String path) throws Exception {
compress(path, true);
}
/**
* 檔案壓縮
*
* @param path
* @param delete
* 是否删除原始檔案
* @throws Exception
*/
public static void compress(String path, boolean delete) throws Exception {
File file = new File(path);
compress(file, delete);
}
/**
* 資料解壓縮
*
* @param data
* @return
* @throws Exception
*/
public static byte[] decompress(byte[] data) throws Exception {
ByteArrayInputStream bais = new ByteArrayInputStream(data);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 解壓縮
decompress(bais, baos);
data = baos.toByteArray();
baos.flush();
baos.close();
bais.close();
return data;
}
/**
* 檔案解壓縮
*
* @param file
* @throws Exception
*/
public static void decompress(File file) throws Exception {
decompress(file, true);
}
/**
* 檔案解壓縮
*
* @param file
* @param delete
* 是否删除原始檔案
* @throws Exception
*/
public static void decompress(File file, boolean delete) throws Exception {
FileInputStream fis = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream(file.getPath().replace(EXT,
""));
decompress(fis, fos);
fis.close();
fos.flush();
fos.close();
if (delete) {
file.delete();
}
}
/**
* 資料解壓縮
*
* @param is
* @param os
* @throws Exception
*/
public static void decompress(InputStream is, OutputStream os)
throws Exception {
GZIPInputStream gis = new GZIPInputStream(is);
int count;
byte data[] = new byte[BUFFER];
while ((count = gis.read(data, , BUFFER)) != -) {
os.write(data, , count);
}
gis.close();
}
/**
* 檔案解壓縮
*
* @param path
* @throws Exception
*/
public static void decompress(String path) throws Exception {
decompress(path, true);
}
/**
* 檔案解壓縮
*
* @param path
* @param delete
* 是否删除原始檔案
* @throws Exception
*/
public static void decompress(String path, boolean delete) throws Exception {
File file = new File(path);
decompress(file, delete);
}
}
例如,将List類型的list 加密再解密。這裡我們使用了Gson将Map對象轉換為json字元串。
List<YDUserStoryInfoVO> list = list結果;
Gson gson = new Gson();
String json = gson.toJson(list);
byte[] zipbytes = GzipUtil.compress(json.getBytes());
byte[] unzipbytes = GzipUtil.decompress(zipbytes);
String newJson = new String(unzipbytes);
List<YDUserStoryInfoVO> list = gson.fromJson(newJson ,new TypeToken<List<YDUserStoryInfoVO>>() {}.getType());