اعتبار سنجی مقادیر ورودی که از کاربر میگیریم همیشه نیاز دارند که مورد اعتبار سنجی قرار بگیرند چون میخواهیم همواره دیتایی از کاربر دریافت و یا ذخیره کنیم که مورد انتظار ما است و همینطور از نفوذ فعالیت های مخرب تا حدی جلوگیری شود
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.3.7.RELEASE</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.4.0.Final</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.8.7</version> </dependency>
در Spring MVC طبق استاندارد JSR349 از اعتبار سنجی سمت سرور پشتیبانی میکند که بصورت annotation تعریف شده اند
استفاده از Annotation های Validation در یک کلاس Data Model :
public class User { @NotNull @Email private String email; @NotNull @Size(min = 4, max = 15) private String password; @NotBlank private String name; @Min(18) @Digits(integer = 2, fraction = 0) private int age; // standard constructor, getters, setters }
annotation های بالا جز JSR349 هستند به جز Email@ و NotBlank@ که از کتابخانه Hibernate-Validator استفاده شده است
فرض کنید کلاس Controller ای داریم که درخواست های user/ را رسیدگی میکند و وظیفه آن گرفتن اطلاعات کاربر و ساختن یک ابجکت User جدید در یک List است
برای اینکه ابجکت ورودی معتبر باشد از Valid@ استفاده میکنیم که داخل کلاس User روی تک تک فیلد ها سیاست های اعتبار سنجی را ست کرده ایم و اگر اعتبار سنجی مشکلی داشت از طریق ابجکت BindingResult و متد ()hasError میتوانیم مطلع شویم :
@PostMapping(value = "/user") @ResponseBody public ResponseEntity<Object> saveUser(@Valid User user, BindingResult result, Model model) { if (result.hasErrors()) { List<String> errors = result.getAllErrors().stream() .map(DefaultMessageSourceResolvable::getDefaultMessage) .collect(Collectors.toList()); return new ResponseEntity<>(errors, HttpStatus.OK); } else { if (users.stream().anyMatch(it -> user.getEmail().equals(it.getEmail()))) { return new ResponseEntity<>( Collections.singletonList("Email already exists!"), HttpStatus.CONFLICT); } else { users.add(user); return new ResponseEntity<>(HttpStatus.CREATED); } } }
با اینکه اعتبار سنجی سمت کلاینت میتواند توسط کاربران خرابکار دور زده شود ولی اغلب کاربران بدنبال اهداف خرابکارانه نیستند و داشتن اعتبار سنجی سمت کلاینت میتواند تجربه کاربری بهتری را ارائه دهد ولی در هر صورت کاملا غیر اصولی است که اعتبار سنجی سمت سرور نداشته باشیم
فریم ورک هایی نظیر Angular قابلیت های خوبی برای اعتبار سنجی دارند که میتوانیم استفاده کنیم که میتوانید جهت اطلاعات بیشتر آنها را مطالعه فرمایید