@Controller yoki @ControllerAdvice anotatsiyalangan classlar @InitBinder anotatsiyalangan metodlarga ega bo'lishi mumkin, ular WebDataBinder misollarini ishga tushiradi, va ular quyidagilarni bajarishi mumkin:
-
So'rov parametrlarini (ya'ni forma yoki so'rov ma'lumotlarini) model obyektiga bog'lash.
-
So'rov satr qiymatlarini (masalan, so'rov parametrlarini, yo'l o'zgaruvchilarini, sarlavhalarni, cookie ma'lumotlarini va hokazo) kontroller metod argumentlari tiplariga aylantirish.
-
Model obyekt qiymatlarini HTML-forms ko'rsatilayotganda
Stringqiymat sifatida formatlash.
@InitBinder bilan anotatsiyalangan metodlar kontrollerga xos java.beans.PropertyEditor yoki Spring'dan Converter va Formatter komponentlarini ro'yxatdan o'tkazishi mumkin. Bundan tashqari, Converter va Formatter turlarini global bo'lib bo'lishadigan FormattingConversionServiceda ro'yxatdan o'tkazish uchun MVC konfiguratsiyasidan foydalanish mumkin.
@InitBinder anotatsiyalangan metodlar ko'p hollarda @RequestMapping anotatsiyalangan metodlar bilan bir xil argumentlarni qo'llab-quvvatlaydi, @ModelAttribute (buyruq obyekti) anotatsiyalangan argumentlaridan tashqari. Odatda, ular WebDataBinder argumenti bilan e'lon qilinadi (ro'yxatdan o'tkazish protseduralari uchun) va qaytariladigan qiymat void bo'ladi. Quyidagi misolda bu ko'rsatilgan:
@Controller
public class FormController {
@InitBinder
public void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
}
// ...
}
@InitBinderanotatsiyasi bilan metodning aniqlanishi.
@Controller
class FormController {
@InitBinder
fun initBinder(binder: WebDataBinder) {
val dateFormat = SimpleDateFormat("yyyy-MM-dd")
dateFormat.isLenient = false
binder.registerCustomEditor(Date::class.java, CustomDateEditor(dateFormat, false))
}
// ...
}
@InitBinderanotatsiyasi bilan metodning aniqlanishi.
Bundan tashqari, agar siz umumiy FormattingConversionService orqali Formatter asosidagi sozlamadan foydalansangiz, quyidagi misolda ko'rsatilganidek, kontrollerga xos Formatter realizatsiyalarini qayta ishlatishingiz va ro'yxatdan o'tkazishingiz mumkin:
@Controller
public class FormController {
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd"));
}
// ...
}
- Maxsus formatlash uchun
@InitBinderanotatsiyasi bilan metodning aniqlanishi.
@Controller
class FormController {
@InitBinder
protected fun initBinder(binder: WebDataBinder) {
binder.addCustomFormatter(DateFormatter("yyyy-MM-dd"))
}
// ...
}
- Maxsus formatlash uchun
@InitBinderanotatsiyasi bilan metodning aniqlanishi.
Model tuzilishi
Veb-ilovalar kontekstida ma'lumotlarni bog'lash HTTP so'rov parametrlarini (ya'ni forma ma'lumotlari yoki so'rov parametrlarini) model obyekti va uning ichki obyektlariga bog'lashni anglatadi.
Ma'lumotlarni bog'lash uchun faqat public JavaBeans nomlash konvensiyalari bilan mos keladigan xususiyatlar mavjud – masalan, firstName xususiyat uchun public String getFirstName() va public void setFirstName(String).
Standart bo'yicha Spring model obyekti grafikidagi barcha ommaviy xususiyatlarga bog'lanishni ta'minlaydi. Bu shuni anglatadiki, modelda qanday ommaviy xususiyatlar mavjudligini ehtiyotkorlik bilan o'ylab, mijoz har qanday ommaviy xususiyatni, hatto ushbu foydalanish holati uchun mo'ljallanmaganlarni ham maqsad qilib olishi mumkin.
Misol uchun, HTTP forma ma'lumotlarini qayta ishlaydigan endpoint mavjud bo'lsa, zararli mijoz brauzerda taqdim etilgan HTML forma qismi bo'lmagan, lekin model obyekti grafigida mavjud bo'lgan xususiyatlar uchun qiymatlar yuborishi mumkin. Bu kutilmagan ma'lumotlarning model obyektiga va uning ichki obyektlariga o'rnatilishiga olib kelishi mumkin.
Tavsiya etilgan yondashuv ixtisoslashgan model obyektini ishlatishdir, u faqat formani yuborish bilan bog'liq xususiyatlarni ochadi. Masalan, foydalanuvchining elektron pochta manzilini o'zgartirish formasida model obyekti minimal xususiyat to'plamini e'lon qilishi kerak, quyidagi ChangeEmailFormda ko'rsatilganidek.
public class ChangeEmailForm {
private String oldEmailAddress;
private String newEmailAddress;
public void setOldEmailAddress(String oldEmailAddress) {
this.oldEmailAddress = oldEmailAddress;
}
public String getOldEmailAddress() {
return this.oldEmailAddress;
}
public void setNewEmailAddress(String newEmailAddress) {
this.newEmailAddress = newEmailAddress;
}
public String getNewEmailAddress() {
return this.newEmailAddress;
}
}
Agar siz ma'lumotlarni bog'lash holatlari uchun har bir foydalanish holati uchun ixtisoslashgan model obyekti ishlatishni istamasangiz yoki ishlata olmasangiz, unda ma'lumotlarni bog'lashga ruxsat berilgan xususiyatlarni cheklashingiz kerak. Idealda, bu WebDataBinderda setAllowedFields() metodidan foydalanib, ruxsat etilgan maydonlar shablonlarini ro'yxatdan o'tkazish orqali amalga oshirilishi mumkin.
Misol uchun, ilovangizda ruxsat etilgan maydonlar shablonlarini ro'yxatdan o'tkazish uchun, quyida ko'rsatilgandek, @Controller yoki @ControllerAdvice anotatsiyalangan komponentda @InitBinder anotatsiyalangan metodni amalga oshirishingiz mumkin:
@Controller
public class ChangeEmailController {
@InitBinder
void initBinder(WebDataBinder binder) {
binder.setAllowedFields("oldEmailAddress", "newEmailAddress");
}
// методларини @RequestMapping ва ҳ.к. билан анотатсиялаш
}
Ruxsat etilgan maydonlar shablonlarini ro'yxatdan o'tkazishga qo'shimcha ravishda, DataBinder va uning subclasslarida setDisallowedFields() metodi yordamida ruxsat etilmagan maydonlar shablonlarini ham ro'yxatdan o'tkazish mumkin. Lekin shuni yodda tutingki, "ruxsat etuvchi ro'yxat" xavfsizroq, "taqiqlovchi ro'yxat" esa yo'q. Shunday qilib, setAllowedFields() dan foydalanishni setDisallowedFields() dan foydalanishdan ustun qo'yish kerak.
Ruxsat etilgan maydonlar shablonlariga mos kelish katta va kichik harflarga e'tiborlidir; taqiqlangan maydonlar shablonlariga mos kelish esa yo'q. Bundan tashqari, taqiqlangan shablonga mos keladigan maydon, agar u ruxsat etilganlar ro'yxatidagi shablonga ham mos keladigan bo'lsa ham, qabul qilinmaydi.
Agar modelingizning predmeti domenini ma'lumotlar bog'lash uchun ochayotgan bo'lsangiz, ruxsat etilgan va ruxsat etilmagan maydonlar shablonlarini to'g'ri sozlash juda muhimdir. Aks holda, bu katta xavfsizlik xatariga olib keladi.
Bundan tashqari, sizning predmeti domeni modelingiz turlarini, masalan, JPA yoki Hibernate entity'larini, ma'lumotlar bog'lash stsenariylarida model obyekti sifatida foydalanmaslik tavsiyа qilinadi.
GO TO FULL VERSION