SpringMVC中的http Caching的具體使用_第1頁
SpringMVC中的http Caching的具體使用_第2頁
SpringMVC中的http Caching的具體使用_第3頁
SpringMVC中的http Caching的具體使用_第4頁
SpringMVC中的http Caching的具體使用_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第SpringMVC中的httpCaching的具體使用SpringETagfilter

Cache是HTTP協(xié)議中的一個非常重要的功能,使用Cache可以大大提高應(yīng)用程序的性能,減少數(shù)據(jù)的網(wǎng)絡(luò)傳輸。

通常來說我們會對靜態(tài)資源比如:圖片,CSS,JS文件等做緩存。同樣的我們可以使用HTTPCache配合SpringMVC來做動態(tài)資源的緩存。

那么什么時候使用動態(tài)資源的緩存呢?

只有當這個資源不經(jīng)常更新或者你確切的知道該資源什么時候更新的時候就可以使用HTTPCache了。

HTTPCache是通過請求頭來實現(xiàn)的,主要有三種方式:過期時間,最后更新時間和Etag。

其中過期時間是客戶端驗證,最后更新時間和Etag是服務(wù)器端驗證。

過期時間

過期時間又有兩種方式,分別是Cache-Control和Expires頭。

在Cache-Control中,我們可以設(shè)置它的maxAge,超出該時間后,該資源才會被再次請求。如下所示:

@GetMapping("/{id}")

ResponseEntityProductgetProduct(@PathVariablelongid){

//…

CacheControlcacheControl=CacheControl.maxAge(30,TimeUnit.MINUTES);

returnResponseEntity.ok()

.cacheControl(cacheControl)

.body(product);

}

我們也可以在Head中設(shè)置Expires屬性。Expires的時間需要是標準時間格式,如下:

Sun,06Nov199408:49:37GMT;RFC822,updatedbyRFC1123

Sunday,06-Nov-9408:49:37GMT;RFC850,obsoletedbyRFC1036

SunNov608:49:371994;ANSIC'sasctime()format

如果要在java中使用,參考如下的例子:

@GetMapping("/forecast")

ResponseEntityForecastgetTodaysForecast(){

//...

ZonedDateTimeexpiresDate=ZonedDateTime.now().with(LocalTime.MAX);

Stringexpires=expiresDate.format(DateTimeFormatter.RFC_1123_DATE_TIME);

returnResponseEntity.ok()

.header(HttpHeaders.EXPIRES,expires)

.body(weatherForecast);

}

如果Cache-Control和Expires同時出現(xiàn),則會優(yōu)先使用Cache-Control。

Last-Modified

它的驗證邏輯是這樣的,客戶端會根據(jù)上次請求得到的Last-Modified設(shè)置它的If-Modified-Since,服務(wù)器端接收到了這個屬性之后可以跟之前的進行比較,如果相同則可以返回一個空的body。如下所示:

@GetMapping("/{id}")

ResponseEntityProductgetProduct(@PathVariablelongid,WebRequestrequest){

Productproduct=repository.find(id);

longmodificationDate=product.getModificationDate()

.toInstant().toEpochMilli();

if(request.checkNotModified(modificationDate)){

returnnull;

returnResponseEntity.ok()

.lastModified(modificationDate)

.body(product);

}

ETag

Last-Modified的時間只能精確到秒,如果還需要更細粒度的話,就需要用到ETag了。

ETag可以看成當前時刻某個資源的唯一標記,你可以取該資源的hash值作為ETag。

下面是它的一種實現(xiàn):

@GetMapping("/{id}")

ResponseEntityProductgetProduct(@PathVariablelongid,WebRequestrequest){

Productproduct=repository.find(id);

StringmodificationDate=product.getModificationDate().toString();

StringeTag=DigestUtils.md5DigestAsHex(modificationDate.getBytes());

if(request.checkNotModified(eTag)){

returnnull;

returnResponseEntity.ok()

.eTag(eTag)

.body(product);

}

SpringETagfilter

Spring提供了一個ShallowEtagHeaderFilter來根據(jù)返回的內(nèi)容自動為你生成Etag。

@Bean

publicFilterRegistrationBeanfilterRegistrationBean(){

ShallowEtagHeaderFiltereTagFilter=newShallowEtagHeaderFilter();

FilterRegistrationBeanregistration=newFilterReg

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論