JavaRush /Курсы /All lectures for AM purposes /HTTP քեշավորում

HTTP քեշավորում

All lectures for AM purposes
1 уровень , 602 лекция
Открыта

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 տիպը օգտագործում է դեպք-կենտրոնացված մոտեցում, որը կենտրոնանում է ընդհանուր սցենարների վրա:

Java
// Քեշավորում մեկ ժամ - "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();
Kotlin
// Քեշավորում մեկ ժամ - "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-ին՝ հետևյալ օրինակում:

Java
@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);
}
Kotlin
@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 վերնագրերը:

Կարող եք նաև ստուգել պայմանական հարցման վերնագրերը կոնտրոլերում՝ հետևյալ օրինակում:

Java
@RequestMapping
public String myHandleMethod(WebRequest request, Model model) {
    long eTag = ... 
    if (request.checkNotModified(eTag)) {
        return null; 
    }
    model.addAttribute(...); 
    return "myViewName";
}
  1. Ծրագրի համար հատուկ հաշվարկ:
  2. Պատասխանը նշանակվել է 304 (NOT_MODIFIED) - հավելյալ մշակում արգելված է:
  3. Սկսում ենք հարցի մշակում:
Kotlin
@RequestMapping
fun myHandleMethod(request: WebRequest, model: Model): String? {
    val eTag: Long = ... 
    if (request.checkNotModified(eTag)) {
        return null 
    }
    model[...] = ... 
    return "myViewName"
}
  1. Ծրագրի համար հատուկ հաշվարկ:
  2. Պատասխանը նշանակվել է 304 (NOT_MODIFIED) - հավելյալ մշակում արգելված է:
  3. Սկսում ենք հարցի մշակում:

Կան երեք տարբերակ՝ ստուգել պայմանական հարցումները՝ eTag արժեքներին, lastModified արժեքներին կամ երկուսին համաձայն: Պայմանական GET և HEAD հարցումների համար, կարող եք հաստատել 304 (NOT_MODIFIED) պատասխանը: Պայմանական POST, PUT և DELETE հարցումների համար, հնարավոր է հաստատել 412 (PRECONDITION_FAILED) պատասխանը՝ կանխելու համաժամանակյա փոփոխությունները:

Ստատիկ ռեսուրսներ

Համապատասխան աշխատանքի համար ստատիկ ռեսուրսները պետք է մշակվեն Cache-Control և պայմանական վերնագրերով:

ETag ֆիլտր

ShallowEtagHeaderFilter-ը կարելի է օգտագործել "մակերեսային" eTag արժեքներ ավելացնելու համար, որոնք հաշվարկվում են պատասխան բովանդակությունից և, այսպիսով, խնայողություն են կատարում թողունակության, բայց ոչ պրոցեսորի ժամանակի վրա:

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ