使用Filter實現正文壓縮

2021-08-23 13:52:36 字數 3343 閱讀 1418

public class compressionresponsestream extends servletoutputstream 

protected void setbuffer(int threshold)

public void close() throws ioexception

/** 根據gzipstream是否為null,就可以判斷寫入的內容是否達到

* 啟用壓縮的臨界值,因為到達臨界值時,write方法會自動建立gzipstream物件

*/if (gzipstream != null) else

}output.close();

closed = true;

}public void flush() throws ioexception

if (gzipstream != null)

}/**

* 將buffer緩衝區中的資料寫入到gzipstream中

** @throws ioexception

*/public void flushtogzip() throws ioexception

}@override

public void write(int b) throws ioexception

/** 當寫入的資料達到啟用壓縮的臨界值時, 則先將buffer緩衝區的資料寫入到gzipstream物件中

*/if (buffercount >= buffer.length)

buffer[buffercount++] = (byte) b;

}public void write(byte b) throws ioexception

public void write(byte b, int off, int len) throws ioexception

if (len == 0)

/** 如果buffer緩衝區中剩餘的空間能夠容納要寫入的資料, 則先將這些資料寫入到buffer緩衝區中

*/if (len <= (buffer.length - buffercount))

/** 如果buffer緩衝區剩餘的空間不能容納要寫入的資料, 則先將buffer緩衝區的原有資料寫入到gzipstream物件中

*/flushtogzip();

/** 騰空buffer緩衝區資料後,判斷整個buffer緩衝區是否能夠容納要寫入的資料, 如果能將這些資料寫入到buffer緩衝區中

*/if (len <= (buffer.length - buffercount))

/** 如果整個buffer緩衝區的空間都不能容納要寫入的資料, 則直接將這些資料寫入gzipstream中

*/writetogzip(b, off, len);

}/**

* 將gzipstream物件中寫入資料,如果第一次寫入 則還需建立gzips實體物件

/*** 建立自定義response物件包括輸出流物件

* * @return

* @throws ioexception

*/public servletoutputstream createoutputstream() throws ioexception

/*** 為了防止目標servlet沒有關閉輸出流物件,filter呼叫該方法 以便自動關閉輸出流物件

*/public void finishresponse() else

}} catch (exception e)

} /**

* 覆蓋flushbuffer方法

*/public void flushbuffer() throws ioexception

/*** 覆蓋getoutputstream方法

*/public servletoutputstream getoutputstream() throws ioexception

if (stream == null)

return stream;

} public printwriter getwriter() throws ioexception

if (stream != null)

stream = createoutputstream();

string charenc = origresponse.getcharacterencoding();

if (charenc != null) else

return writer; }}

public class compressionfilter implements filter  else 

} else

} public void dofilter(servletrequest request, servletresponse response,

filterchain chain) throws ioexception, servletexception

/** 檢測客戶端瀏覽器是否支援gzip資料壓縮格式

使用Filter實現靜態HTML緩衝

緩衝是web應用中必須考慮的乙個提高效能的重要手段。對於基於jsp servlet技術的站點,常用的緩衝有持久層的資料庫連線池緩衝,記憶體中的值物件緩衝,jsp頁面緩衝,以及各種各樣的緩衝框架等等,無不是為了提高系統的吞吐量。然而對於大型站點來說,將jsp頁面轉換為靜態html也許是最高效的方法,特...

使用GZipStream實現壓縮和解壓縮

之前做專案,涉及到存入到資料庫或者http傳輸的資料量比較大,這個時候,就需要考慮在存入資料庫或者傳送傳輸之前,將資料壓縮下,當從資料庫中取出時,再解壓還原資料。特地找了下發現有gzipstream可以實現這個功能。此類表示gzip資料格式,該格式使用行業標準演算法進行無損檔案壓縮和解壓縮。該格式包...

使用logrotate實現日誌輪訓壓縮

配置選項說明 compress 通過gzip 壓縮轉儲舊的日誌 nocompress 不需要壓縮時,用這個引數 copytruncate 用於還在開啟中的日誌檔案,把當前日誌備份並截斷 nocopytruncate 備份日誌檔案但是不截斷 create mode owner group 使用指定的檔...