CORS עם אביב

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

בכל דפדפן מודרני, שיתוף משאבים חוצה-מקור (CORS) הוא מפרט רלוונטי עם הופעתם של לקוחות HTML5 ו- JS הצורכים נתונים באמצעות ממשקי API של REST.

במקרים רבים, המארח המשרת את ה- JS (למשל, example.com) שונה מהמארח שמגיש את הנתונים (למשל, api.example.com). במקרה כזה, CORS מאפשר תקשורת בין תחומים.

Spring מספק תמיכה מהשורה הראשונה ב- CORS, ומציע דרך קלה ועוצמתית להגדיר אותה בכל יישום אינטרנט של Spring או Spring Boot.

2. שיטת בקר תצורת CORS

הפעלת CORS היא פשוטה - פשוט הוסף את ההערה @ CrossOrigin.

אנו עשויים ליישם זאת בכמה דרכים שונות.

2.1. @ CrossOrigin על @ RequestMapping-שיטת המטפל המבואר

@RestController @RequestMapping ("/ account") AccountController בכיתה ציבורית {@CrossOrigin @RequestMapping (method = RequestMethod.GET, path = "/ {id}") אחזור חשבון ציבורי (@PathVariable מזהה ארוך) {// ...} @RequestMapping (method = RequestMethod.DELETE, path = "/ {id}") הסר ריק / ריק (@PathVariable Long ID) {// ...}}

בדוגמה לעיל, הפעלנו CORS רק עבור ה- להחזיר() שיטה. אנו יכולים לראות שלא הגדרנו שום תצורה עבור ה- @ CrossOrigin ביאור, כך שהוא משתמש בברירות המחדל:

  • כל המקורות מותרים
  • שיטות ה- HTTP המותרות הן אלה שצוינו ב- @ בקשת מיפוי ביאור (לדוגמא זו GET)
  • הזמן בו נשמרת שמירת התגובה הקדמית (maxAge) הוא 30 דקות

2.2. @ CrossOrigin על הבקר

@CrossOrigin (origins = "//example.com", maxAge = 3600) @ RestController @RequestMapping ("/ account") AccountController בכיתה ציבורית {@RequestMapping (method = RequestMethod.GET, path = "/ {id}") ציבורי אחזור חשבון (@PathVariable מזהה ארוך) {// ...} @RequestMapping (method = RequestMethod.DELETE, path = "/ {id}") הסר ריק / ריק (@PathVariable Long ID) {// ...}}

הפעם, הוספנו @ CrossOrigin ברמת הכיתה. כתוצאה מכך, שניהם להחזיר() ו לְהַסִיר() שיטות מאפשרות זאת. אנו יכולים להתאים אישית את התצורה על ידי ציון הערך של אחת מתכונות ההערות: מקורות, שיטות, מותר כותרות, חשוף כותרות, אפשר אישורים, אוֹ maxAge.

2.3. @ CrossOrigin על שיטת בקר ומטפל

@CrossOrigin (maxAge = 3600) @RestController @RequestMapping ("/ account") חשבון ציבורי AccountController {@CrossOrigin ("// example.com") @RequestMapping (method = RequestMethod.GET, "/ {id}") חשבון ציבורי אחזר (@PathVariable מזהה ארוך) {// ...} @RequestMapping (method = RequestMethod.DELETE, path = "/ {id}") הסר ריק / ציבורי (@PathVariable Long ID) {// ...}}

אביב ישלב תכונות משתי ההערות ליצירת תצורת CORS ממוזגת.

בדוגמה זו, לשתי השיטות יהיה maxAge של 3600 שניות, השיטה לְהַסִיר() יאפשר את כל המקורות, אך השיטה להחזיר() יאפשר רק מקורות מ //example.com.

3. תצורת CORS גלובלית

כחלופה לתצורה המבוססת על הערות משובחות, Spring מאפשר לנו להגדיר תצורת CORS גלובלית מתוך הבקרים שלך. זה דומה לשימוש ב- לְסַנֵן פתרון מבוסס אך ניתן להכריז על MVC באביב ולשלב עם גרגירים עדינים @ CrossOrigin תְצוּרָה.

כברירת מחדל, כל המקורות ושיטות GET, HEAD ו- POST מותרים.

3.1. JavaConfig

@Configuration @EnableWebMvc מחלקה ציבורית WebConfig מיישם את WebMvcConfigurer {@Override public void addCorsMappings (CorsRegistry registry) {registry.addMapping ("/ **"); }}

הדוגמה שלמעלה מאפשרת בקשות CORS מכל מקור לכל נקודת קצה ביישום.

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

בנוסף, יש גם מותר שיטות, מותר כותרות, חשוף כותרות, maxAge, ו אפשר אישורים שנוכל להשתמש בהם כדי להגדיר את כותרות התגובה ואפשרויות ההתאמה האישית.

3.2. מרחב שמות XML

תצורת XML מינימלית זו מאפשרת ל- CORS ב- /** תבנית נתיב עם אותם מאפייני ברירת מחדל כמו JavaConfig:

אפשר גם להכריז על כמה מיפויי CORS עם מאפיינים מותאמים אישית:

4. CORS עם אבטחת אביב

אם נשתמש באבטחת האביב בפרויקט שלנו, עלינו לנקוט בצעד נוסף כדי לוודא שהוא משחק טוב עם CORS. זה בגלל שחייבים לעבד את CORS תחילה. אחרת, Spring Security תדחה את הבקשה לפני שתגיע ל- MVC של Spring.

למרבה המזל, Spring Security מספק פיתרון מהקופסה:

@EnableWebSecurity מחלקה ציבורית WebSecurityConfig מרחיב את WebSecurityConfigurerAdapter {@Override מוגן חלל להגדיר (HttpSecurity http) זורק חריג {http.cors (). ו- () ...}}

מאמר זה מסביר זאת ביתר פירוט.

5. איך זה עובד

בקשות CORS נשלחות אוטומטית לרשומים השונים HandlerMappings. הם מטפלים בבקשות של CORS בהקדמה ומיירטים CORS בקשות פשוטות וממשות באמצעות CorsProcessor יישום (DefaultCorsProcessor כברירת מחדל) כדי להוסיף את כותרות התגובה הרלוונטיות של CORS (כגון בקרת גישה-אפשר-מקור).

CorsConfiguration מאפשר לנו לציין כיצד יש לעבד את בקשות ה- CORS: מקורות מותרים, כותרות ושיטות, בין היתר. אנו עשויים לספק זאת בדרכים שונות:

  • AbstractHandlerMapping # setCorsConfiguration () מאפשר לציין a מַפָּה עם כמה CorsConfigurationממופה על דפוסי שבילים כגון / api / **
  • שיעורי משנה עשויים לספק את עצמם CorsConfiguration על ידי עקיפת ה- AbstractHandlerMapping # getCorsConfiguration (Object, HttpServletRequest) שיטה
  • מטפלים רשאים ליישם את CorsConfigurationSource ממשק (כמו ResourceHttpRequestHandler עכשיו עושה) לספק א CorsConfiguration לכל בקשה

6. מסקנה

במאמר זה הראינו כיצד אביב מספק תמיכה להפעלת CORS ביישום שלנו.

התחלנו עם תצורת הבקר. ראינו שעלינו להוסיף רק את ההערה @ CrossOrigin כדי לאפשר CORS או לשיטה מסוימת אחת או לבקר כולו.

לבסוף ראינו גם שאם אנו רוצים לשלוט בתצורת CORS מחוץ לבקרים, נוכל לבצע זאת בצורה חלקה בקבצי התצורה - באמצעות JavaConfig או XML.

קוד המקור המלא של הדוגמאות זמין באתר GitHub.


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