HTTP քեշավորումը կարող է զգալիորեն բարձրացնել վեբ-հավելվածի աշխատանքը: HTTP քեշավորումը կառուցվում է Cache-Control
պատասխանային վերնագրի շուրջ և, հանրաճանաչ, պայմանական հարցման վերնագրերի (ինչպես Last-Modified
և ETag
) վրա: Cache-Control
նշում է մասնավոր (օրինակ՝ զննական) և հանրային (օրինակ՝ proxy) քեշերին, ինչպես քեշավորել և կրկնակի օգտագործել պատասխանները: ETag
վերնագիրը օգտագործվում է պայմանական հարցման համար, որը կարող է հանգեցնել 304 (NOT_MODIFIED) պատասխանի առանց մարմնի, եթե բովանդակությունը չի փոփոխվել: ETag
կարելի է ընդունել որպես Last-Modified
վերնագրի առավել կատարելագործված ժառանգորդ:
Այս բաժնում նկարագրված են Spring Web MVC-ում հասանելի HTTP քեշավորման հետ կապված տարբերակները:
CacheControl
CacheControl
ապահովում է միջոցներ Cache-Control
վերնագրի հետ կապված պարամետրերի կարգավորման համար և ընդունվում է որպես արգումենտ մի շարք տեղերում:
-
Կոնտրոլերներ
-
Ստատիկ ռեսուրսներ
Քանի որ RFC 7234 -ը նկարագրում է Cache-Control
պատասխանային վերնագրի բոլոր հնարավոր հրահանգները, CacheControl
տիպը օգտագործում է դեպք-կենտրոնացված մոտեցում, որը կենտրոնանում է ընդհանուր սցենարների վրա:
// Քեշավորում մեկ ժամ - "Cache-Control: max-age=3600"
CacheControl ccCacheOneHour = CacheControl.maxAge(1, TimeUnit.HOURS);
// Կանխարգելում քեշավորում - "Cache-Control: no-store".
CacheControl ccNoStore = CacheControl.noStore();
// Քեշավորում տասը օր հանրային և մասնավոր քեշերում,
// հանրային քեշը չէ պետք է փոխի պատասխանը
// "Cache-Control: max-age=864000, public, no-transform"
CacheControl ccCustom = CacheControl.maxAge(10, TimeUnit.DAYS).noTransform().cachePublic();
// Քեշավորում մեկ ժամ - "Cache-Control: max-age=3600"
val ccCacheOneHour = CacheControl.maxAge(1, TimeUnit.HOURS)
// Կանխարգելում քեշավորում - "Cache-Control: no-store".
val ccNoStore = CacheControl.noStore()
// Քեշավորում տասը օր հանրային և մասնավոր քեշերում,
// հանրային քեշը չէ պետք է փոխի պատասխանը
// "Cache-Control: max-age=864000, public, no-transform"
val ccCustom = CacheControl.maxAge(10, TimeUnit.DAYS).noTransform().cachePublic()
WebContentGenerator
նպատակում է նաև ավելի պարզ cachePeriod
հատկությունը (որոշված է վայրկյաններով), որը աշխատում է այսպես:
-
-1
արժեքը չի ստեղծումCache-Control
պատասխանային վերնագիրը: -
0
արժեքը կանխում է քեշավորումը"Cache-Control: no-store"
հրահանգով: -
Այն դեպքում, երբ
n > 0
, տրամադրված պատասխանը քեշավորվում էn
վայրկյան"Cache-Control: max-age=n"
հրահանգով:
Կոնտրոլերներ
Կոնտրոլերները կարող են ավելացնել ակնհայտ աջակցություն HTTP քեշավորման: Մենք խորհուրդ ենք տալիս դա անել, քանի որ անհրաժեշտ է որոշել lastModified
կամ ETag
արժեքը ռեսուրսի համար, նախքան պատասխանելն պայմանական վերնագրերով: Կոնտրոլերը կարող է ավելացնել ETag
վերնագիրը և Cache-Control
պայմանները ResponseEntity
-ին՝ հետևյալ օրինակում:
@GetMapping("/book/{id}")
public ResponseEntity<Book> showBook(@PathVariable Long id) {
Book book = findBook(id);
String version = book.getVersion();
return ResponseEntity
.ok()
.cacheControl(CacheControl.maxAge(30, TimeUnit.DAYS))
.eTag(version) // lastModified is also available
.body(book);
}
@GetMapping("/book/{id}")
fun showBook(@PathVariable id: Long): ResponseEntity<Book> {
val book = findBook(id);
val version = book.getVersion()
return ResponseEntity
.ok()
.cacheControl(CacheControl.maxAge(30, TimeUnit.DAYS))
.eTag(version) // lastModified is also available
.body(book)
}
Նախորդ օրինակում 304 (NOT_MODIFIED) պատասխանը վերադառնում է առանց մարմնի, եթե պայմանական վերնագրերի հետ համեմատության արդյունքով բովանդակությունը չի փոխվել: Եթե ոչ, պատասխանին ավելանում են ETag
և Cache-Control
վերնագրերը:
Կարող եք նաև ստուգել պայմանական հարցման վերնագրերը կոնտրոլերում՝ հետևյալ օրինակում:
@RequestMapping
public String myHandleMethod(WebRequest request, Model model) {
long eTag = ...
if (request.checkNotModified(eTag)) {
return null;
}
model.addAttribute(...);
return "myViewName";
}
- Ծրագրի համար հատուկ հաշվարկ:
- Պատասխանը նշանակվել է 304 (NOT_MODIFIED) - հավելյալ մշակում արգելված է:
- Սկսում ենք հարցի մշակում:
@RequestMapping
fun myHandleMethod(request: WebRequest, model: Model): String? {
val eTag: Long = ...
if (request.checkNotModified(eTag)) {
return null
}
model[...] = ...
return "myViewName"
}
- Ծրագրի համար հատուկ հաշվարկ:
- Պատասխանը նշանակվել է 304 (NOT_MODIFIED) - հավելյալ մշակում արգելված է:
- Սկսում ենք հարցի մշակում:
Կան երեք տարբերակ՝ ստուգել պայմանական հարցումները՝ eTag արժեքներին, lastModified արժեքներին կամ երկուսին համաձայն: Պայմանական GET
և HEAD
հարցումների համար, կարող եք հաստատել 304 (NOT_MODIFIED) պատասխանը: Պայմանական POST
, PUT
և DELETE
հարցումների համար, հնարավոր է հաստատել 412 (PRECONDITION_FAILED) պատասխանը՝ կանխելու համաժամանակյա փոփոխությունները:
Ստատիկ ռեսուրսներ
Համապատասխան աշխատանքի համար ստատիկ ռեսուրսները պետք է մշակվեն Cache-Control
և պայմանական վերնագրերով:
ETag
ֆիլտր
ShallowEtagHeaderFilter
-ը կարելի է օգտագործել "մակերեսային" eTag արժեքներ ավելացնելու համար, որոնք հաշվարկվում են պատասխան բովանդակությունից և, այսպիսով, խնայողություն են կատարում թողունակության, բայց ոչ պրոցեսորի ժամանակի վրա:
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ