כותרות מטמון באביב MVC

1. סקירה כללית

במדריך זה נלמד על מטמון HTTP. אנו נבחן גם דרכים שונות ליישום מנגנון זה בין לקוח ליישום MVC של Spring.

2. הכנסת מטמון HTTP

כשאנחנו פותחים דף אינטרנט בדפדפן, זה בדרך כלל מוריד משאבים רבים משרת האינטרנט:

לדוגמא, בדוגמה זו, דפדפן צריך להוריד שלושה משאבים עבור אחד /התחברות עמוד. מקובל כי דפדפן מגיש מספר בקשות HTTP לכל דף אינטרנט. כעת, אם אנו מבקשים דפים כאלה בתדירות גבוהה מאוד, הדבר גורם לתעבורת רשת רבה ולוקח יותר זמן לשרת דפים אלה.

כדי להפחית את עומס הרשת, פרוטוקול HTTP מאפשר לדפדפנים לשמור במטמון חלק מהמשאבים הללו. אם מופעל, דפדפנים יכולים לשמור עותק של משאב במטמון המקומי. כתוצאה מכך, דפדפנים יכולים להגיש דפים אלה מהאחסון המקומי במקום לבקש אותם דרך הרשת:

שרת אינטרנט יכול להפנות את הדפדפן למטמון משאב מסוים על ידי הוספת Cache-Control כותרת בתגובה.

מכיוון שהמשאבים נשמרים כעותק מקומי,קיים סיכון להצגת תוכן מעופש מהדפדפן. לכן, שרתי אינטרנט בדרך כלל מוסיפים זמן תפוגה ב Cache-Control כּוֹתֶרֶת.

בסעיפים הבאים נוסיף כותרת זו בתגובה מבקר MVC של Spring. מאוחר יותר נראה גם ממשקי API של Spring לאימות המשאבים במטמון בהתבסס על זמן התפוגה.

3. Cache-Control בתגובת הבקר

3.1. באמצעות תגובה תגובה

הדרך הכי פשוטה לעשות זאת היאלהשתמש ב CacheControl כיתת בנאים הניתנת על ידי אביב:

@GetMapping ("/ hello / {name}") @ ResponseBody Public ResponseEntity שלום (@PathVariable שם מחרוזת) {CacheControl cacheControl = CacheControl.maxAge (60, TimeUnit.SECONDS) .noTransform () .mustRevalidate (); החזר ResponseEntity.ok () .cacheControl (cacheControl) .body ("שלום" + שם); }

זה יוסיף א Cache-Control כותרת בתגובה:

@Test בטל כאשרHome_thenReturnCacheHeader () זורק חריג {this.mockMvc.perform (MockMvcRequestBuilders.get ("/ שלום / baeldung")) .andDo (MockMvcResultHandlers.print ()) .andExpect (MockMvcResultMatchers.) .Stat. andExpect (MockMvcResultMatchers.header () .string ("Cache-Control", "max-age = 60, must-revalidate, no-transform")); }

3.2. באמצעות HttpServletResponse

לעתים קרובות, הבקרים צריכים להחזיר את שם התצוגה משיטת המטפל. אולם, התגובה תגובה class אינו מאפשר לנו להחזיר את שם התצוגה ולהתמודד עם גוף הבקשה בו זמנית.

לחלופין, עבור בקרים כאלה אנו יכולים להגדיר את Cache-Control כותרת ב- HttpServletResponse באופן ישיר:

@GetMapping (value = "/ home / {name}") בית מחרוזת ציבורי (@PathVariable שם מחרוזת, תגובת HttpServletResponse סופית) {response.addHeader ("Cache-Control", "max-age = 60, חייב לאבד מחדש, לא -שינוי צורה"); לחזור הביתה"; }

זה יוסיף גם א Cache-Control כותרת בתגובת HTTP דומה לסעיף האחרון:

@Test בטל כאשר Home_thenReturnCacheHeader () זורק חריג {this.mockMvc.perform (MockMvcRequestBuilders.get ("/ home / baeldung")). AndDo (MockMvcResultHandlers.print ()). AndExpect (MockMvcResultMatchers.) .Stat. andExpect (MockMvcResultMatchers.header () .string ("Cache-Control", "max-age = 60, must-revalidate, no-transform")). andExpect (MockMvcResultMatchers.view (). name ("home")); }

4. Cache-Control למשאבים סטטיים

באופן כללי, יישום ה- MVC של Spring שלנו משרת הרבה משאבים סטטיים כמו קבצי HTML, CSS ו- JS. מכיוון שקבצים כאלה צורכים רוחב פס רב של רשת, לכן חשוב לדפדפנים לשמור אותם במטמון. אנו נאפשר זאת שוב באמצעות ה- Cache-Control כותרת בתגובה.

אביב מאפשר לנו לשלוט בהתנהגות המטמון הזו במיפוי משאבים:

@Override public void addResourceHandlers (הרישום הסופי ResourceHandlerRegistry) {registry.addResourceHandler ("/ resources / **"). AddResourceLocations ("/ resources /") .setCacheControl (CacheControl.maxAge (60, TimeUnit.SECONDS) .noTransform (). חייב לאשר ()); }

זה מבטיח כי כל המשאביםמוגדר תחת/אֶמְצָעִי מוחזרים עם Cache-Control כותרת בתגובה.

5. Cache-Control ביירוטים

אנו יכולים להשתמש ביירוטים ביישום MVC באביב שלנו כדי לבצע עיבוד מקדים ואחרי כל בקשה. זהו מציין מיקום נוסף בו אנו יכולים לשלוט בהתנהגות המטמון של היישום.

כעת במקום ליישם מיירט מותאם אישית, נשתמש ב- WebContentInterceptor מסופק על ידי אביב:

@ ביטול ריקים ציבוריים addInterceptors (רישום InterceptorRegistry) {WebContentInterceptor interceptor = WebContentInterceptor new (); interceptor.addCacheMapping (CacheControl.maxAge (60, TimeUnit.SECONDS) .noTransform () .mustRevalidate (), "/ login / *"); registry.addInterceptor (מיירט); }

הנה, רשמנו את WebContentInterceptor והוסיף את Cache-Control כותרת דומה לסעיפים האחרונים. יש לציין שנוכל להוסיף שונה Cache-Control כותרות לדפוסי URL שונים.

בדוגמה שלעיל, לכל הבקשות החל מ- /התחברות, נוסיף את הכותרת הזו:

@Test בטל כאשר Interceptor_thenReturnCacheHeader () זורק חריג {this.mockMvc.perform (MockMvcRequestBuilders.get ("/ login / baeldung")) .andDo (MockMvcResultHandlers.print ()) .andExpect (MockMvcResultMatch.). andExpect (MockMvcResultMatchers.header () .string ("Cache-Control", "max-age = 60, must-revalidate, no-transform")); }

6. אימות מטמון ב- MVC באביב

עד כה דנו בדרכים שונות לכלול א Cache-Control כותרת בתגובה. זה מציין את הלקוחות או הדפדפנים לשמור את המשאבים במטמון בהתבסס על מאפייני תצורה כמו גיל מקסימלי.

זה בדרך כלל רעיון טוב להוסיף זמן תפוגה של מטמון עם כל משאב. כתוצאה מכך, דפדפנים יכולים להימנע מהגשת משאבים שפג תוקפם מהמטמון.

למרות שהדפדפנים צריכים לבדוק תמיד את התפוגה, יתכן שלא יהיה צורך לאחזר את המשאב בכל פעם מחדש. אם דפדפן יכול לאמת שמשאב לא השתנה בשרת, הוא יכול להמשיך ולהגיש את הגרסה במטמון שלו. ולמטרה זו, HTTP מספק לנו שני כותרות תגובה:

  1. Etag - כותרת תגובת HTTP המאחסנת ערך hash ייחודי כדי לקבוע אם משאב במטמון השתנה בשרת - מתאים אם-אין-התאמה כותרת הבקשה חייבת להכיל את הערך האחרון של Etag
  2. שונה לאחרונה - כותרת תגובת HTTP המאחסנת יחידת זמן בה עודכן לאחרונה המשאב - מקביל אם-ללא שינוי-מאז כותרת הבקשה חייבת לכלול את התאריך האחרון ששונה

אנו יכולים להשתמש באחד מהכותרות הללו כדי לבדוק אם יש צורך לאחזר משאב שפג תוקפו. לאחר אימות הכותרות,השרת יכול לשלוח מחדש את המשאב או לשלוח קוד HTTP 304 כדי לא לציין שום שינוי. עבור התרחיש האחרון, דפדפנים יכולים להמשיך להשתמש במשאב המטמון.

ה שונה לאחרונה כותרת יכולה לאחסן רק מרווחי זמן עד שניות דיוק. זו יכולה להיות מגבלה במקרים בהם נדרשת תפוגה קצרה יותר. מסיבה זו, מומלץ להשתמש Etag במקום זאת. מאז Etag כותרת מאחסנת ערך hash, ניתן ליצור hash ייחודי עד למרווחים עדינים יותר כמו ננו שניות.

עם זאת, בואו לבדוק איך זה נראה להשתמש שונה לאחרונה.

Spring מספק כמה שיטות שימוש כדי לבדוק אם הבקשה מכילה כותרת תפוגה או לא:

@GetMapping (value = "/ productInfo / {name}") אימות ResponseEntity ציבורי (@PathVariable שם מחרוזת, בקשת WebRequest) {ZoneId zoneId = ZoneId.of ("GMT"); long lastModifiedTimestamp = LocalDateTime.of (2020, 02, 4, 19, 57, 45) .atZone (zoneId) .toInstant (). toEpochMilli (); if (request.checkNotModified (lastModifiedTimestamp)) {return ResponseEntity.status (304) .build (); } להחזיר את ResponseEntity.ok (). body ("שלום" + שם); }

האביב מספק את checkNotModified () שיטה לבדוק אם משאב שונה מאז הבקשה האחרונה:

@Test בטל כאשר Validate_thenReturnCacheHeader () זורק חריג {כותרות HttpHeaders = HttpHeaders חדש (); headers.add (IF_UNMODIFIED_SINCE, "יום שלישי, 04 בפברואר 2020 19:57:25 GMT"); this.mockMvc.perform (MockMvcRequestBuilders.get ("/ productInfo / baeldung"). headers (headers)) .andDo (MockMvcResultHandlers.print ()) .andExpect (MockMvcResultMatchers.status (). is (304)); }

7. מסקנה

במאמר זה למדנו על מטמון HTTP באמצעות ה- Cache-Control כותרת תגובה באביב MVC. אנו יכולים להוסיף את הכותרת בתגובת הבקר באמצעות ה- תגובה תגובה בכיתה או באמצעות מיפוי משאבים למשאבים סטטיים.

אנו יכולים גם להוסיף כותרת זו עבור תבניות URL מסוימות באמצעות מיירטים של Spring.

כמו תמיד, הקוד זמין ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found