Spring MVC CORS (turli manbalar o'rtasida resurslar almashinuvi)ni boshqarishga imkon beradi.
Kirish
Xavfsizlik nuqtai nazaridan brauzerlar joriy manbadan tashqaridagi resurslarga AJAX-murojaatlarini taqiqlaydi. Masalan, bir oynada o'z bank hisobingiz, boshqasida esa evil.com bo'lishi mumkin. Evil.com saytidan skriptlar sizning bank API'ga sizning hisob ma'lumotlaringiz bilan AJAX-so'rovlar qilmasligi kerak – masalan, sizning hisobingizdan pul yechish kabi!
Turli manbalar o'rtasida resurslar almashinuvi (CORS) – bu W3C spetsifikatsiyasi bo'lib, ko'pchilik brauzerlarda amalga oshirilgan, bu esa qaysi domenlararo so'rovlar ruxsat etilganligini aniqlash imkonini beradi, IFRAME yoki JSONP-ga asoslangan kamroq xavfsiz va kamroq kuchli yo'l-yo'riqlarni ishlatish o'rniga.
Boshqarish
CORS spetsifikatsiyasi oldindan, oddiy va haqiqiy so'rovlarni ajratadi. CORS qanday ishlashini tushunish uchun, ushbu maqolani o'qishingiz mumkin va/yoki spetsifikatsiyaga murojaat qilishingiz mumkin.
Spring MVC-dagi HandlerMapping amalga oshirilishlari CORS uchun o'rnatilgan qo'llab-quvvatlashni ta'minlaydi. So'rovni muvaffaqiyatli ravishda boshqaruvchiga xaritalashidan so'ng, HandlerMapping amalga oshirilishlari ushbu so'rov va boshqaruvchi uchun CORS konfiguratsiyasini tekshiradi va qo'shimcha chora-tadbirlarni amalga oshiradi. Oldindan so'rovlar to'g'ridan-to'g'ri ko'rib chiqiladi, oddiy va haqiqiy CORS-so'rovlar ushlanadi, tekshiriladi va ular uchun zarur CORS-javob sarlavhalari o'rnatiladi.
Turli manbalar o'rtasidagi so'rovlarni ruxsat berish uchun (ya'ni, Origin sarlavhasi mavjud bo'lib, so'rov xostidan farq qiladi), sizga CORSni aniq belgilangan biron-bir konfiguratsiyani ta'minlashingiz kerak bo'ladi. Agar mos CORS konfiguratsiyasi topilmasa, oldindan so'rovlar rad etiladi. Oddiy va haqiqiy CORS-so'rovlarga CORS sarlavhalari qo'shilmaydi va, shuning uchun, brauzerlar ularni rad etadi.
Har bir HandlerMappingni skonfiguratsiya qilish mumkin URL-shablonlarga asoslangan CorsConfiguration xaritalari bilan alohida. Aksariyat hollarda dasturlar bunday xaritalashlarni e'lon qilish uchun Java-konfiguratsiyasi y MSIni yoki XML nom maydonini ishlatadi, bu esa barcha HandlerMapping misollari uchun bitta global xaritani taqdim etadi.
Global darajadagi CORS sozlamalarini boshqaruvchilar darajasidagi yanada nozik sozlamalar bilan birlashtirish mumkin. Masalan, belgilar bilan belgilangan kontrollar sinf yoki metodlar darajasida @CrossOrigin annotatsiyalaridan foydalanishi mumkin (boshqa boshqaruvlar CorsConfigurationSourceni amalga oshirishi mumkin).
Global va lokal konfiguratsiyalarni birlashtirish qoidalari odatda qo'shimchali – masalan, barcha global va barcha lokal manbalar. Faqatgina bitta qiymat qabul qilishi mumkin bo'lgan atributlar uchun, masalan, allowCredentials va maxAge, lokal qiymat global qiymatni almashtiradi. Toshqqlar haqida batafsil ma'lumot olish uchun qarang CorsConfiguration#combine(CorsConfiguration).
Ko'proq ma'lumot olish yoki kengaytirilgan sozlash uchun, kodni ko'rib chiqing:
-
CorsConfiguration -
CorsProcessor,DefaultCorsProcessor -
AbstractHandlerMapping
@CrossOrigin
@CrossOrigin annotatsiyasi mana shu misolda ko'rsatilganidek, annotatsiyalangan boshqaruvchi metodlariga turli manbalardan so'rovlarni bajarish imkonini beradi:
@RestController
@RequestMapping("/account")
public class AccountController {
@CrossOrigin
@GetMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@DeleteMapping("/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}
@RestController
@RequestMapping("/account")
class AccountController {
@CrossOrigin
@GetMapping("/{id}")
fun retrieve(@PathVariable id: Long): Account {
// ...
}
@DeleteMapping("/{id}")
fun remove(@PathVariable id: Long) {
// ...
}
}
Standart holatda @CrossOrigin quyidagilarga ruxsat beradi:
-
Barcha manbalar.
-
Barcha sarlavhalar.
-
Boshqaruvchi metodlari bilan mos keladigan barcha HTTP-metodlar.
allowCredentials standart holatda faollashtirilmagan, chunki bu foydalanuvchining maxfiy ma'lumotlarini (masalan, cookies va CSRF-tokeni) ochib beradigan ishonch darajasini belgilaydi, shuning uchun uni faqat zarur holatlarda ishlatish kerak. Agar bu faollashtirilsa, unda allowOrigins bir yoki bir necha aniqlangan domenlar uchun belgilanishi kerak (ammo maxsus "*" qiymati emas) yoki, boshqa variant sifatida, dinamik manbalar to'plamini moslashtirish uchun allowOriginPatterns mulkidan foydalanish mumkin.
maxAge 30 daqiqaga o'rnatiladi.
@CrossOrigin annotatsiyasi sinf darajasida qo'llab-quvvatlanadi va barcha metodlar tomonidan meros qilib olinadi, quyidagi misolda ko'rsatilganidek:
@CrossOrigin(origins = "https://domain2.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {
@GetMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@DeleteMapping("/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}
@CrossOrigin(origins = ["https://domain2.com"], maxAge = 3600)
@RestController
@RequestMapping("/account")
class AccountController {
@GetMapping("/{id}")
fun retrieve(@PathVariable id: Long): Account {
// ...
}
@DeleteMapping("/{id}")
fun remove(@PathVariable id: Long) {
// ...
}
Siz @CrossOrigin annotatsiyasini sinf darajasida ham, metod darajasida ham ishlatishingiz mumkin, quyidagi misolda ko'rsatilganidek:
@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {
@CrossOrigin("https://domain2.com")
@GetMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@DeleteMapping("/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}
@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/account")
class AccountController {
@CrossOrigin("https://domain2.com")
@GetMapping("/{id}")
fun retrieve(@PathVariable id: Long): Account {
// ...
}
@DeleteMapping("/{id}")
fun remove(@PathVariable id: Long) {
// ...
}
}
Global konfiguratsiya
Boshqaruvchi metodlari darajasidagi nozikroq sozlamalarga qo'shimcha ravishda, siz, ehtimol, global CORS konfiguratsiyasini belgilashingiz kerak bo'ladi. Siz har qanday HandlerMapping uchun URL-manzillar asosida CorsConfiguration xaritalarini alohida sozlashingiz mumkin. Aksariyat dasturlar buning uchun Java'dagi MVC konfiguratsiyasini yoki XML'dagi MVC makonini ishlatadi.
Standart holatda global konfiguratsiya quyidagilarni faollashtiradi:
-
Barcha manbalar.
-
Barcha sarlavhalar.
-
GET,HEADvaPOSTmetodlari.
allowCredentials standart holatda faollashtirilmagan, chunki bu foydalanuvchining maxfiy ma'lumotlarini (masalan, cookies va CSRF-tokeni) ochib beradigan ishonch darajasini belgilaydi, shuning uchun uni faqat zarur holatlarda ishlatish kerak. Agar bu faollashtirilsa, unda allowOrigins bir yoki bir necha aniqlangan domenlar uchun belgilanishi kerak (ammo maxsus "*" qiymati emas) yoki, boshqa variant sifatida, dinamik manbalar to'plamini moslashtirish uchun allowOriginPatterns mulkidan foydalanish mumkin.
maxAge 30 daqiqaga o'rnatiladi.
Java-konfiguratsiya
Java-konfiguratsiyada CORS'ni faollashtirish uchun, quyidagi misolda ko'rsatilganidek, CorsRegistry callback'dan foydalanishingiz mumkin:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("https://domain2.com")
.allowedMethods("PUT", "DELETE")
.allowedHeaders("header1", "header2", "header3")
.exposedHeaders("header1", "header2")
.allowCredentials(true).maxAge(3600);
// Boshqa xaritalashlarni qo'shing...
}
}
@Configuration
@EnableWebMvc
class WebConfig : WebMvcConfigurer {
override fun addCorsMappings(registry: CorsRegistry) {
registry.addMapping("/api/**")
.allowedOrigins("https://domain2.com")
.allowedMethods("PUT", "DELETE")
.allowedHeaders("header1", "header2", "header3")
.exposedHeaders("header1", "header2")
.allowCredentials(true).maxAge(3600)
// Boshqa xaritalashlarni qo'shing...
}
}
XML-konfiguratsiya
XML nom maydonida CORS'ni faollashtirish uchun <mvc:cors> elementidan foydalanishingiz mumkin, quyidagi misolda ko'rsatilganidek:
<mvc:cors>
<mvc:mapping path="/api/**"
allowed-origins="https://domain1.com, https://domain2.com"
allowed-methods="GET, PUT"
allowed-headers="header1, header2, header3"
exposed-headers="header1, header2" allow-credentials="true"
max-age="123" />
<mvc:mapping path="/resources/**"
allowed-origins="https://domain1.com" />
</mvc:cors>
CORS-filtri
Ichki CorsFilter orqali CORS qo'llab-quvvatlashni qo'llashingiz mumkin.
CorsFilterni Spring Security bilan ishlatishga harakat qilayotgan bo'lsangiz, Spring Security CORSni ichki qo'llab-quvvatlaydi.
Filtirni sozlash uchun, quyidagi misolda ko'rsatilganidek, uning konstruktoriga CorsConfigurationSourceni o'tkazing:
CorsConfiguration config = new CorsConfiguration();
// Ehtimol...
// config.applyPermitDefaultValues()
config.setAllowCredentials(true);
config.addAllowedOrigin("https://domain1.com");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
CorsFilter filter = new CorsFilter(source);
val config = CorsConfiguration()
// Ehtimol...
// config.applyPermitDefaultValues()
config.allowCredentials = true
config.addAllowedOrigin("https://domain1.com")
config.addAllowedHeader("*")
config.addAllowedMethod("*")
val source = UrlBasedCorsConfigurationSource()
source.registerCorsConfiguration("/**", config)
val filter = CorsFilter(source)
GO TO FULL VERSION