最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解析SpringBoot項(xiàng)目開發(fā)之Gzip壓縮過程

 更新時(shí)間:2020年07月13日 15:23:07   作者:杜先武博客  
這篇文章主要介紹了SpringBoot項(xiàng)目開發(fā)之Gzip壓縮過程,本文給大家分享幾種Gzip壓縮方式,通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

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

下面介紹幾種 Gzip壓縮方式

1.SpringBoot開啟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ò)傳輸量,頁面加載速度加快

2.Tomcat開啟Gzip壓縮

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

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

3.Nginx開啟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行:開啟Gzip
第2行:不壓縮臨界值,大于1K的才壓縮,一般不用改
第3行:buffer,不用改
第4行:用了反向代理的話,末端通信是HTTP/1.0,有需求的應(yīng)該也不用看我這科普文了;有這句的話注釋了就行了,默認(rèn)是HTTP/1.1
第5行:壓縮級(jí)別,1-10,數(shù)字越大壓縮的越好,時(shí)間也越長,看心情隨便改吧
第6行:進(jìn)行壓縮的文件類型,缺啥補(bǔ)啥就行了,JavaScript有兩種寫法,最好都寫上吧,總有人抱怨js文件沒有壓縮,其實(shí)多寫一種格式就行了
第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("原長度:" + 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)));
  }
}

到此這篇關(guān)于SpringBoot項(xiàng)目開發(fā)之Gzip壓縮過程的文章就介紹到這了,更多相關(guān)SpringBoot Gzip壓縮內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java計(jì)算工作時(shí)間除去節(jié)假日以及雙休日

    java計(jì)算工作時(shí)間除去節(jié)假日以及雙休日

    這篇文章主要為大家詳細(xì)介紹了java計(jì)算工作時(shí)間除去節(jié)假日以及雙休日的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • 如何在JAVA中使用Synchronized

    如何在JAVA中使用Synchronized

    這篇文章主要介紹了如何在JAVA中使用Synchronized,文中代碼非常詳細(xì),對(duì)大家的學(xué)習(xí)有所幫助,感興趣的朋友可以參考下
    2020-06-06
  • Java基礎(chǔ)學(xué)習(xí)之接口詳解

    Java基礎(chǔ)學(xué)習(xí)之接口詳解

    接口,是Java語言中一種引用類型,是方法的集合,如果說類的內(nèi)部封裝了成員變量、構(gòu)造方法和成員方法,那么接口的內(nèi)部主要就是封裝了方法。本文通過一些示例詳細(xì)為大家展示了接口的使用,需要的可以參考一下
    2022-10-10
  • String轉(zhuǎn)BigDecimal,BigDecimal常用操作,以及避免踩坑記錄

    String轉(zhuǎn)BigDecimal,BigDecimal常用操作,以及避免踩坑記錄

    這篇文章主要介紹了String轉(zhuǎn)BigDecimal,BigDecimal常用操作,以及避免踩坑記錄,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • SpringBoot啟動(dòng)及自動(dòng)裝配原理過程詳解

    SpringBoot啟動(dòng)及自動(dòng)裝配原理過程詳解

    這篇文章主要介紹了SpringBoot啟動(dòng)及自動(dòng)裝配原理過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Java動(dòng)態(tài)驗(yàn)證碼單線設(shè)計(jì)的兩種方法

    Java動(dòng)態(tài)驗(yàn)證碼單線設(shè)計(jì)的兩種方法

    這篇文章主要介紹了Java動(dòng)態(tài)驗(yàn)證碼單線設(shè)計(jì)的兩種方法,需要的朋友可以參考下
    2018-07-07
  • 如何在springboot中引入?yún)?shù)校驗(yàn)

    如何在springboot中引入?yún)?shù)校驗(yàn)

    一般我們判斷前端傳過來的參數(shù),需要對(duì)某些值進(jìn)行判斷,是否滿足條件,而springboot相關(guān)的參數(shù)校驗(yàn)注解,可以解決我們這個(gè)問題,本文給大家介紹如何在springboot中引入?yún)?shù)校驗(yàn),感興趣的朋友一起看看吧
    2023-12-12
  • SpringBoot整合dataworks的實(shí)現(xiàn)過程

    SpringBoot整合dataworks的實(shí)現(xiàn)過程

    這篇文章主要介紹了SpringBoot整合dataworks的實(shí)現(xiàn)過程,實(shí)現(xiàn)主要是編寫工具類,如果需要?jiǎng)t可以配置成SpringBean,注入容器即可使用,需要的朋友可以參考下
    2022-08-08
  • Java實(shí)現(xiàn)分布式系統(tǒng)限流

    Java實(shí)現(xiàn)分布式系統(tǒng)限流

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)分布式系統(tǒng)限流,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Spring實(shí)戰(zhàn)之使用Expression接口進(jìn)行表達(dá)式求值操作示例

    Spring實(shí)戰(zhàn)之使用Expression接口進(jìn)行表達(dá)式求值操作示例

    這篇文章主要介紹了Spring實(shí)戰(zhàn)之使用Expression接口進(jìn)行表達(dá)式求值操作,結(jié)合實(shí)例形式分析了Spring操作Expression接口實(shí)現(xiàn)表達(dá)式運(yùn)算的操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2019-12-12

最新評(píng)論

桐庐县| 灵宝市| 大洼县| 明光市| 全南县| 云和县| 缙云县| 固安县| 延长县| 荔浦县| 扬中市| 库车县| 哈巴河县| 南阳市| 铅山县| 塘沽区| 南江县| 尤溪县| 宿松县| 永靖县| 大渡口区| 南昌县| 冕宁县| 定远县| 弥勒县| 七台河市| 绥江县| 本溪市| 麻城市| 瑞安市| 东安县| 沁源县| 旌德县| 汉中市| 武安市| 商河县| 三原县| 嘉荫县| 广丰县| 镇平县| 郴州市|