@RequestMapping

All lectures for UZ purposes
Daraja, Dars
Mavjud

Siz @RequestMapping annotatsiyasidan kontroler metodlariga so'rovlarni bog'lash uchun foydalanishingiz mumkin. U URL-manzil, HTTP-metod, so'rov parametrlari, sarlavhalar va ma'lumot turlariga bog'lash uchun turli atributlarga ega. Siz uni umumiy bog'lashlarni ifodalash uchun klass darajasida yoki aniq bir endpointning bog'lanishini toraytirish uchun metod darajasida ishlatishingiz mumkin.

HTTP-metodiga xos bo'lgan @RequestMapping annotatsiyasining qisqartmalari mavjud:

  • @GetMapping

  • @PostMapping

  • @PutMapping

  • @DeleteMapping

  • @PatchMapping

Qisqartmalar maxsus annotatsiyalardir, chunki aksariyat kontroler metodlari ma'lum bir HTTP-metodiga bog'lanishi kerak, @RequestMapping annotatsiyasi esa odatda barcha HTTP-metodlarga bog'lanadi. Klass darajasida umumiy bog'lanishni ifodalash uchun @RequestMapping hali ham zarur.

Quyidagi misol tip va metod darajasida bog'lanishni ko'rsatadi:

Java
@RestController
@RequestMapping("/persons")
class PersonController {
    @GetMapping("/{id}")
    public Person getPerson(@PathVariable Long id) {
        // ...
    }
    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public void add(@RequestBody Person person) {
        // ...
    }
}
Kotlin
@RestController
@RequestMapping("/persons")
class PersonController {
    @GetMapping("/{id}")
    fun getPerson(@PathVariable id: Long): Person {
        //...
    }
    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    fun add(@RequestBody person: Person) {
        // ...
    }
}

URI-identifikator shablonlari

@RequestMapping annotatsiyalangan metodlar URL-manzillar shablonlari orqali bog'lanishi mumkin. Ikki alternativasi mavjud:

  • PathPattern - URL-manzilning oldindan tahlil qilingan shabloni, shuningdek, oldindan tahlil qilingan PathContainer sifatida URL-manzil yo'li bilan bogʻlangan shablon. Bu yechim tarmoq muhitida ishlatish uchun yaratilgan, kodlash va yo'l parametrlari bilan samarali ishlaydi hamda samarali bog'lanishni ta'minlaydi.

  • AntPathMatcher - satr yo'liga satr modelini moslashtirish. Bu birinchi yechim bo'lib, Spring konfiguratsiyasida classpath, fayl tizimi va boshqa joylar resurslarini tanlash uchun ishlatiladi. Bu kamroq samarador, satr yo'li kiritilishi URL-kodlash va boshqa muammolar bilan samarali ishlashni qiyinlashtiradi.

PathPattern veb-dasturlar uchun tavsiya etilgan yechim va Spring WebFluxda ishlayotganda yagona variant hisoblanadi. 5.3-versiyaga qadar AntPathMatcher Spring MVCda ishlatilganda yagona variant edi va u sukut bo'yicha qoladi. Lekin PathPatternni MVC konfiguratsiyasida yoqish mumkin.

PathPattern va AntPathMatcher bilan bir xil shablon sintaksisini qo'llab-quvvatlaydi. Shuningdek, masalan, {*spring}, yo'lni oxirida 0 yoki undan ko'p yo'l segmentlariga mos keladigan tuzoq shablonini qo'llab-quvvatlaydi. PathPattern shuningdek ** belgisini bir nechta yo'l segmentlariga mos kelish uchun faqat shablon oxirida ruxsat beradi. Bu berilgan so'rov uchun eng yaxshi mos keladigan shablonni tanlashda noaniqlik holatlaridan qochishga imkon beradi. To'liq shablon sintaksisini PathPattern va AntPathMatcher sahifalaridagi bo'limlardan topishingiz mumkin.

Ba'zi shablon misollari:

  • "/resources/ima?e.png" – yo'l segmentida bitta belgiga mos keladi

  • "/resources/*.png" – yo'l segmentida noldan ko'p belgigacha mos keladi

  • "/resources/**" – bir nechta yo'l segmentlariga mos keladi

  • "/projects/{project}/versions" – yo'l segmentiga mos keladi va uni o'zgaruvchi sifatida yozib oladi

  • "/projects/{project:[a-z]+}/versions" – mos kelishi va muntazam ifoda orqali o'zgaruvchini ushlab olish

URI-identifikator o'zgaruvchilariga @PathVariable annotatsiyasi orqali murojaat qilish mumkin. Masalan:

Java
@GetMapping("/owners/{ownerId}/pets/{petId}")
public Pet findPet(@PathVariable Long ownerId, @PathVariable Long petId) {
    // ...
}
Kotlin
@GetMapping("/owners/{ownerId}/pets/{petId}")
fun findPet(@PathVariable ownerId: Long, @PathVariable petId: Long): Pet {
    // ...
}

Siz klass va metod darajasida URI-identifikator o'zgaruvchilarini e'lon qilishingiz mumkin, quyidagi misolda ko'rsatilganidek:

Java
@Controller
@RequestMapping("/owners/{ownerId}")
public class OwnerController {
    @GetMapping("/pets/{petId}")
    public Pet findPet(@PathVariable Long ownerId, @PathVariable Long petId) {
        // ...
    }
}
Kotlin
@Controller
@RequestMapping("/owners/{ownerId}")
class OwnerController {
    @GetMapping("/pets/{petId}")
    fun findPet(@PathVariable ownerId: Long, @PathVariable petId: Long): Pet {
        // ...
    }
}

URI-identifikator o'zgaruvchilari avtomatik tarzda mos turga o'zgartiriladi yoki TypeMismatchException chiqariladi. Oddiy turlar(int, long, Date va hokazo) sukut bo'yicha qo'llab-quvvatlanadi, ammo har qanday boshqa ma'lumot turini qo'llab-quvvatlash vositalarini ro'yxatdan o'tkazishingiz mumkin. "Tur o'zgartirish" va "DataBinder" bo'limlariga qarang.

URI-identifikator o'zgaruvchilariga nomlar berish mumkin (masalan, @PathVariable("customId")), lekin agar nomlar bir xil bo'lsa va kodingiz odatlanish ma'lumotlari yoki Java 8da -parameters flagi bilan kompilyatsiya qilinsa, bu ma'lumotlarni korsatmaasiz mumkin.

{varName:regex} sintaksisi URI-identifikator o'zgaruvchisini muntazam ifoda orqali deklaratsiya qilish spinivini bildiradi, bu {varName:regex} bilan belgilangan sintaksisda bo'ladi. Masalan, "/spring-web-3.0.5.jar" URL-manzili berilgan bo'lsa, quyidagi metod faylning nomini, versiyasini va kengaytmasini olingan:

Java
@GetMapping("/{name:[a-z-]+}-{version:\\d\\.\\d\\.\\d}{ext:\\.[a-z]+}")
public void handle(@PathVariable String name, @PathVariable String version, @PathVariable String ext) {
    // ...
}
Kotlin
@GetMapping("/{name:[a-z-]+}-{version:\\d\\.\\d\\.\\d}{ext:\\.[a-z]+}")
fun handle(@PathVariable name: String, @PathVariable version: String, @PathVariable ext: String) {
    // ...
}

URI-identifikator yo'l shablonlari ${…} kabi joylashtirilgan joy ajratagichlarga ega bo'lishi mumkin, ular PropertySourcesPlaceholderConfigurer bilan ishga tushirilganda lokal, tizim resurslari, muhit resurslari va hokazolarida tan olinadi. Bu, masalan, tashqi konfiguratsiyaga asoslangan asosiy URL-manzilni parametrizatsiya qilish uchun ishlatilishi mumkin.

Shablonlarni solishtirish

Agar URL-manzil bir nechta shablonlarga mos kelsa, eng mosini tanlash kerak. Bu PathPattern sintaktik tahlil qilingan yo'llashga ruxsat berilgan yoki yo'qligiga qarab quyidagi usullardan biri orqali amalga oshiriladi:

Ikkisi ham shablonlarni saralamaydi, faqat eng aniq bo'lganlari yuqorida turgan bo'lsa. Shablon kamroq aniq bo'lsa, unda kamroq URI-identifikator o'zgaruvchilari, yagona joylashtirilgan belgilari va ikkilangan joylashtirilgan belgilari (2 hisoblanadi). Teng ballar bo'lsa, uzunroq shablon tanlanadi. Teng ballar va uzunlik bo'lsa, URI-identifikator o'zgaruvchilari ko'proq bo'lgan shablon tanlanadi.

Sukut bo'yicha mos keladigan shablon (masalan, /**) saralashdan chiqarib tashlanadi va har doim oxirida joylashadi. Bundan tashqari, prefix shablonlar (/public/** kabi) ikki marta joylashtirilgan belgilarsiz boshqa shablonlarga qaraganda kamroq aniq hisoblanadi.

To'liq ma'lumot olish uchun yuqoridagi shablonlar komparatori tavsiflariga havolalarni ko'rib chiqing.

Suffiks mos kelishi

5.3-versiyadan boshlab, Spring MVC sukut bo'yicha .* suffiks ko'rsatmalarini qamrab olishni amalga oshirmaydi, agar kontroler /person bilan bog'langan bo'lsa, u holda /person.* bilan ham bog'lagan bo'ladi. Natijada, yo'l kengaytmalari javob uchun so'ralgan kontent turini talqin qilish uchun ishlatilmaydi - masalan, /person.pdf, /person.xml va hokazo.

Fayl kengaytmalarini bunday ishlatish kerak edi, chunki brauzerlar qabulni qabul qilishni talab qiluvchi sarlavhalarni yuborar edi, bu esa izchil talqin qilish qiyin edi. Bugungi kunda bu shart emas va qabul qilish sarlavhasini ishlatish afzalroq tanlov bo'lishi kerak.

Vaqt o'tishi bilan fayl nomi kengaytmalari ko'plab sabablarga ko'ra muammoli bo'lib chiqdi. Bu URI-identifikator o'zgaruvchilari, yo'l parametrlari va URI-identifikator kodlashidan foydalanishda noaniqliklarni keltirib chiqarishi mumkin. URL bo'yicha ruxsatda to'g'ri asoslash va xavfsizlik ham murakkablashadi (keyingi bo'limni ko'ring).

Yo'l kengaytmalari foydalanishni 5.3-versiyadan avval to'liq o'chirish uchun quyidagilarni belgilang:

  • useSuffixPatternMatching(false)

  • favorPathExtension(false)

Kontent turlarini "Accept" sarlavhasidan farqli ravishda o'zgartirishga qodir bo'lish foydali bo'lishi mumkin, masalan, URL-manzilni brauzerga kiritish vaqti. Yo'l kengaytmasi bilan foydalanishning xavfsiz muqobili so'rov parametri strategiyasidan foydalanishdir. Agar sizga fayl kengaytmalari kerak bo'lsa, ulardan foydalanishni aniq ro'yxatdan o'tkazilgan kengaytmalar bilan cheklashni o'ylab ko'ring, bu esa ContentNegotiationConfigurer orqali ro'yxatga olish imkonini beradi.

Suffiks mos kelishi va RFD

Reflected File Download (RFD) hujum vektori XSSga o'xshaydi, chunki u so'rov ma'lumotlari (masalan, so'rov parametrlari va URI-identifikator o'zgaruvchisi) javobda aks etishiga tayanadi. Biroq, RFD hujum vektori, HTML ichidagi JavaScriptni qo'shish o'rniga, brauzerni javobni yuklash va keyinchalik ikki marta bosish orqali bajariladigan skript sifatida ishlatishga qaratilgan.

Spring MVCda @ResponseBody annotatsiyalangan metodlar va ResponseEntity metodlar xavf ostida, chunki ular URL-manzil yo'li orqali kengaytmalar orqali mijozlar tomonidan talep qilingan turli kontent turlarini aks ettirish vaqti uchun javob beradi. Suffiks mos kelishini va kontentni moslashtirishda yo'l kengaytmalaridan foydalanishni o'chirish har qanday ehtiyojlarni kamaytiradi, lekin RFD hujumlarini oldini olish uchun kerakli emas.

RFD hujumlarini oldini olish uchun Spring MVC javob jismini aks ettirishdan oldin Content-Disposition:inline;filename=f.txt sarlavhasini qo'shib, xavfsiz fayl yuklashni taklif qiladi. Bu faqat URL-manzil yo'li xavfsiz deb ruxsat etilmagan va kontentni moslashtirish uchun aniq ro'yxatdan o'tmagan fayl kengaytmasini o'z ichiga olgan taqdirda amalga oshiriladi. Biroq, bu URL-manzillari brauzerga kiritilgan bo'lsa, yon ta'sirga ega bo'lishi mumkin.

Sukut bo'yicha ko'plab keng tarqalgan yo'l kengaytmalari xavfsiz deb ruxsat etiladi. Moslashtirilgan HttpMessageConverter amalga oshirilgan dasturlar kontentni moslashtirish uchun fayl kengaytmalarini aniq ro'yxatga olish orqali Content-Disposition sarlavhasi qo'shilishidan qochishlari mumkin.

RFDga bog'liq qo'shimcha ko'rsatmalar uchun "CVE-2015-5211" bo'limiga qarang.

Iste'mol qilinadigan ma'lumot turlari

So'rovning Content-Type asosida so'rovlarni bog'lash oraliqni toraytirishingiz mumkin, quyidagi misolda ko'rsatilganidek:

Java
@PostMapping(path = "/pets", consumes = "application/json") 
public void addPet(@RequestBody Pet pet) {
    // ...
}
  1. consumes atributidan foydalanib, kontent turini ko'ra bog'lanish oraliqni toraytirish.
Kotlin
@PostMapping("/pets", consumes = ["application/json"]) 
fun addPet(@RequestBody pet: Pet) {
    // ...
}
  1. consumes atributidan foydalanib, kontent turini ko'ra bog'lanish oraliqni toraytirish.

consumes atributi manfiy ifodalarni ham qo'llab-quvvatlaydi – masalan, !text/plain har qanday kontent turini anglatadi, faqat text/plain dan tashqari.

Umumiy consumes atributini klass darajasida e'lon qilishingiz mumkin. Biroq, ko'pgina boshqa so'rov bog'lash atributlariga qaraganda, klass darajasida foydalanilsa, metod darajasidagi consumes atributi klass darajasidagi e'londan ko'ra qayta belgilaydi.

MediaType ko'pincha ishlatiladigan mediaturlar uchun konstantlarni taqdim etadi, masalan, APPLICATION_JSON_VALUE va APPLICATION_XML_VALUE.

Yaratilgan ma'lumot turlari

So'rov bog'lanish oraliqni so'rov sarlavhasidagi Accept va kontroler metodining chiqaradigan kontent turi ro'yxatiga ko'ra toraytirishingiz mumkin, quyidagi misolda ko'rsatilganidek:

Java
@GetMapping(path = "/pets/{petId}", produces = "application/json") 
@ResponseBody
public Pet getPet(@PathVariable String petId) {
    // ...
}
  1. produces atributidan foydalanib, kontent turini ko'ra bog'lanish oraliqni toraytirish.
Kotlin
@GetMapping("/pets/{petId}", produces = ["application/json"]) 
@ResponseBody
fun getPet(@PathVariable petId: String): Pet {
    // ...
}
  1. produces atributidan foydalanib, kontent turini ko'ra bog'lanish oraliqni toraytirish.

Mediatur turi belgi to'plamini aniqlashi mumkin. Manfiy ifodalar qo'llab-quvvatlanadi – masalan, !text/plain har qanday kontent turini anglatadi, "text/plain" dan tashqari.

Umumiy produces atributini klass darajasida e'lon qilishingiz mumkin. Biroq, ko'pgina boshqa so'rov bog'lash atributlariga qaraganda, klass darajasida foydalanilsa, metod darajasidagi produces atributi klass darajasidagi e'loni qayta belgilaydi.

MediaType ko'pincha ishlatiladigan mediaturlar uchun konstantlarni taqdim etadi, masalan, APPLICATION_JSON_VALUE va APPLICATION_XML_VALUE.

Parametrlar, sarlavhalar

So'rov parametrlarining shartlariga qarab so'rov bog'lanish oraliqni toraytirishingiz mumkin. Siz mavjud so'rov parametrini (myParam), ochiq yo'qligini (!myParam) yoki ma'lum qiymatni (myParam=myValue) tekshirishingiz mumkin. Quyidagi misolda aniq qiymatni qanday tekshirish kerakligi ko'rsatilgan:

Java
@GetMapping(path = "/pets/{petId}", params = "myParam=myValue") 
public void findPet(@PathVariable String petId) {
    // ...
}
  1. myParam myValue ga tengligini tekshirish.
Kotlin
@GetMapping("/pets/{petId}", params = ["myParam=myValue"]) 
fun findPet(@PathVariable petId: String) {
    // ...
}
  1. myParam myValue ga tengligini tekshirish.

Xuddi shu narsa so'rov sarlavhasi shartlari bilan ham ishlatilishi mumkin, quyidagi misolda ko'rsatilganidek:

Java
@GetMapping(path = "/pets", headers = "myHeader=myValue") 
public void findPet(@PathVariable String petId) {
    // ...
}
  1. myHeader myValue ga tengligini tekshirish.
Kotlin
@GetMapping("/pets", headers = ["myHeader=myValue"]) 
fun findPet(@PathVariable petId: String) {
    // ...
}
Content-Type va Accept shartlariga ko'ra bog'lash mumkin, lekin buning o'rniga consumes va produces ishlatish tavsiya etiladi.

HTTP-metodlar HEAD, OPTIONS

@GetMapping (va @RequestMapping(method=HttpMethod.GET)) HTTP-metod HEADni so'rovlarni bog'lash uchun shaffof qo'llab-quvvatlaydi. Kontroler metodlarini o'zgartirish talab qilinmaydi. Javobni o'rab turuvchi funksiyad عامل ملفنوي. کتگن میتود )) لـي و

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION