SpringBoot項(xiàng)目開(kāi)發(fā):Gzip壓縮

為了減少數(shù)據(jù)在網(wǎng)絡(luò)中的傳輸量,從而減少傳輸時(shí)長(zhǎng)复濒,增加用戶體驗(yàn)脖卖,瀏覽器大都是支持Gzip壓縮技術(shù)的,http的請(qǐng)求頭 Accept-Encoding:gzip, deflate 就表示這次請(qǐng)求可以接受Gzip壓縮后的數(shù)據(jù)巧颈,圖片不要進(jìn)行壓縮畦木,因?yàn)閳D片完全可以在項(xiàng)目開(kāi)發(fā)中使用壓縮后的圖片。壓縮會(huì)有一定的CPU性能損耗砸泛。

下面介紹幾種 Gzip壓縮方式

1.SpringBoot開(kāi)啟Gzip壓縮

在application.properties中加入如下配置:

server.compression.enabled=true
server.compression.mime-types=application/javascript,text/css,application/json,application/xml,text/html,text/xml,text/plain

壓縮前:25.3kb十籍,50.0kb,37.5kb唇礁,5.1kb勾栗,34.7kb

壓縮后:6.4kb,11.7kb盏筐,8.3kb围俘,1.3kb,34.7kb

壓縮后可看到文件有4倍左右的差距琢融,能大大減少網(wǎng)絡(luò)傳輸量界牡,頁(yè)面加載速度加快

2.Tomcat開(kāi)啟Gzip壓縮

tomcat中使用gzip需要進(jìn)行配置,在server.xml中漾抬,在Connector標(biāo)簽中加入如下屬性

compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/css,text/javascript"

3.Nginx開(kāi)啟Gzip壓縮

gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary off;

重載nginx即可
第1行:開(kāi)啟Gzip
第2行:不壓縮臨界值宿亡,大于1K的才壓縮,一般不用改
第3行:buffer奋蔚,不用改
第4行:用了反向代理的話她混,末端通信是HTTP/1.0,有需求的應(yīng)該也不用看我這科普文了泊碑;有這句的話注釋了就行了坤按,默認(rèn)是HTTP/1.1
第5行:壓縮級(jí)別,1-10馒过,數(shù)字越大壓縮的越好臭脓,時(shí)間也越長(zhǎng),看心情隨便改吧
第6行:進(jìn)行壓縮的文件類型腹忽,缺啥補(bǔ)啥就行了来累,JavaScript有兩種寫(xiě)法砚作,最好都寫(xiě)上吧,總有人抱怨js文件沒(méi)有壓縮嘹锁,其實(shí)多寫(xiě)一種格式就行了
第7行:跟Squid等緩存服務(wù)有關(guān)葫录,on的話會(huì)在Header里增加”Vary: Accept-Encoding”,我不需要這玩意领猾,自己對(duì)照情況看著辦吧

4.GZIPOutputStream米同,GZIPInputStream壓縮與解壓

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import org.apache.commons.codec.binary.StringUtils;

public class GZIPUtils {

public static final String GZIP_ENCODE_UTF_8 = "UTF-8";
public static final String GZIP_ENCODE_ISO_8859_1 = "ISO-8859-1";

/**
 * 字符串壓縮為GZIP字節(jié)數(shù)組
 * @param str
 * @return
 */
public static byte[] compress(String str) {
    return compress(str, GZIP_ENCODE_UTF_8);
}

/**
 * 字符串壓縮為GZIP字節(jié)數(shù)組
 * @param str
 * @param encoding
 * @return
 */
public static byte[] compress(String str, String encoding) {
    if (str == null || str.length() == 0) {
        return null;
    }
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    GZIPOutputStream gzip;
    try {
        gzip = new GZIPOutputStream(out);
        gzip.write(str.getBytes(encoding));
        gzip.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return out.toByteArray();
}

/**
 * GZIP解壓縮
 * @param bytes
 * @return
 */
public static byte[] uncompress(byte[] bytes) {
    if (bytes == null || bytes.length == 0) {
        return null;
    }
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    ByteArrayInputStream in = new ByteArrayInputStream(bytes);
    try {
        GZIPInputStream ungzip = new GZIPInputStream(in);
        byte[] buffer = new byte[256];
        int n;
        while ((n = ungzip.read(buffer)) >= 0) {
            out.write(buffer, 0, n);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return out.toByteArray();
}

/**
 * 解壓并返回String
 * @param bytes
 * @return
 */
public static String uncompressToString(byte[] bytes) {
    return uncompressToString(bytes, GZIP_ENCODE_UTF_8);
}

/**
 * 解壓
 * @param bytes
 * @param encoding
 * @return
 */
public static String uncompressToString(byte[] bytes, String encoding) {
    if (bytes == null || bytes.length == 0) {
        return null;
    }
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    ByteArrayInputStream in = new ByteArrayInputStream(bytes);
    try {
        GZIPInputStream ungzip = new GZIPInputStream(in);
        byte[] buffer = new byte[256];
        int n;
        while ((n = ungzip.read(buffer)) >= 0) {
            out.write(buffer, 0, n);
        }
        return out.toString(encoding);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

public static void main(String[] args) {
    String str = "%5B%7B%22lastUpdateTime%22%3A%222011-10-28+9%3A39%3A41%22%2C%22smsList%22%3A%5B%7B%22liveState%22%3A%221";
    System.out.println("原長(zhǎng)度:" + str.length());
    System.out.println("壓縮后字符串:" + GZIPUtils.compress(str).toString().length());
    System.out.println("解壓縮后字符串:" + StringUtils.newStringUtf8(GZIPUtils.uncompress(GZIPUtils.compress(str))));
    System.out.println("解壓縮后字符串:" + GZIPUtils.uncompressToString(GZIPUtils.compress(str)));
}

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市摔竿,隨后出現(xiàn)的幾起案子面粮,更是在濱河造成了極大的恐慌,老刑警劉巖继低,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熬苍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡袁翁,警方通過(guò)查閱死者的電腦和手機(jī)柴底,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)梦裂,“玉大人似枕,你說(shuō)我怎么就攤上這事∧昴” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵褪迟,是天一觀的道長(zhǎng)冗恨。 經(jīng)常有香客問(wèn)我,道長(zhǎng)味赃,這世上最難降的妖魔是什么掀抹? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮心俗,結(jié)果婚禮上傲武,老公的妹妹穿的比我還像新娘。我一直安慰自己城榛,他們只是感情好揪利,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著狠持,像睡著了一般疟位。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上喘垂,一...
    開(kāi)封第一講書(shū)人閱讀 49,929評(píng)論 1 290
  • 那天甜刻,我揣著相機(jī)與錄音绍撞,去河邊找鬼。 笑死得院,一個(gè)胖子當(dāng)著我的面吹牛傻铣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播祥绞,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼矾柜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了就谜?” 一聲冷哼從身側(cè)響起怪蔑,我...
    開(kāi)封第一講書(shū)人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎丧荐,沒(méi)想到半個(gè)月后缆瓣,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡虹统,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年弓坞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片车荔。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡渡冻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出忧便,到底是詐尸還是另有隱情族吻,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布珠增,位于F島的核電站超歌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蒂教。R本人自食惡果不足惜巍举,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望凝垛。 院中可真熱鬧懊悯,春花似錦、人聲如沸梦皮。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)届氢。三九已至欠窒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背岖妄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工型将, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人荐虐。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓七兜,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親福扬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子腕铸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容