предисловие
Подсчитано, что многие друзья думают, что за проверку параметров отвечает клиент, а не сервер. На самом деле это неправильно: любой, кто изучал веб-безопасность, знает, что аутентификация на стороне клиента — это только первая контрольная точка. Проверка его параметров небезопасна.Как только кто-то с намерениями поймает возможность, он может иметь различные методы для имитации Http-запроса системы и доступа к ключевым данным базы данных. Это может привести к простою сервера или утечке данных. Поэтому в это время вам нужно установить второй уровень, и сервер его проверит.
Серверная проверка старых проектов
@RestController
@RequestMapping("/student")
public class ValidateOneController {
@GetMapping("/id")
public Student findStudentById(Integer id){
if(id == null){
logger.error("id 不能为空!");
throw new NullPointerException("id 不能为空");
}
return studentService.findStudentById(id);
}
}
Глядя на приведенный выше код, проверка только одного из них настолько хлопотна. Итак, у нас есть хороший унифицированный метод проверки? Учитывая, что SpringBoot всесилен. Конечно, да.
Среди них Bean Validator и Hibernate Validator — это два набора фреймворков для проверки, оба из которых соответствуют JSR-303 и могут использоваться вместе.Ввиду различий в некоторых аннотациях Validator между ними, например, @Length недоступен. в Bean Validator, поэтому здесь я выбираю смешивание.
JSR-303
JSR-303 — это подспецификация в JAVA EE 6, называемая Bean Validation, Hibernate Validator — эталонная реализация Bean Validation, Hibernate Validator обеспечивает реализацию всех встроенных Constraint (ограничений) в спецификации JSR 303, в дополнение к Некоторое дополнительное ограничение. Все эти Ограничения (ограничения) реализуются через аннотации, см. следующие две таблицы.
Ограничения, встроенные в Bean Validation:
аннотация | эффект |
---|---|
@Null | Аннотированный параметр должен быть пустым. |
@NotNull | Аннотированный параметр не может быть пустым |
@AssertTrue | Аннотированный параметр должен быть True |
@AssertFalse | Аннотированный параметр должен иметь значение False. |
@Min(value) | Аннотированный параметр должен быть числом, а его значение должно быть больше или равно значению |
@Max(value) | Аннотированный параметр должен быть числом, а его значение должно быть меньше или равно значению |
@DecimaMin(value) | Аннотированный параметр должен быть числом, а его значение должно быть больше или равно значению |
@DecimaMax(value) | Аннотированный параметр должен быть числом, а его значение должно быть меньше или равно значению |
@Size(max, min) | Размер аннотируемого параметра должен быть в пределах указанного диапазона. |
@Past | Аннотированные параметры должны быть датой в прошлом. |
@Future | Аннотированный параметр должен быть датой в будущем. |
@Pattern(value) | Аннотированный параметр должен соответствовать указанному регулярному выражению. |
@Digits(integer, fraction) | Аннотированный параметр должен быть числом, и его значение должно находиться в допустимом диапазоне. |
@NotBlank | Значение аннотированного параметра не равно нулю (не равно нулю, а длина равна 0 после удаления первого пробела), в отличие от @NotEmpty, @NotBlank применяется только к строкам и будет удалять пробелы из строк при сравнении |
Дополнительные ограничения Hibernate Validator:
аннотация | эффект |
---|---|
@NotEmpty | Значение аннотированного параметра не равно нулю и не пусто (длина строки не равна 0, размер коллекции не равен 0). |
Аннотированный параметр должен быть адресом электронной почты. | |
@Length | Длина аннотируемой строки должна быть в пределах указанного диапазона. |
@Range | Аннотированный параметр должен находиться в указанном диапазоне. |
Готов к работе
- SpringBoot 2.1.3
- IDEA
- JDK8
Зависимости POM-файлов
<!-- web 启动类 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- test 单元测试类 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- lombok 依赖用于简化 bean -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
класс сущности
Для тестирования добавлены правила проверки параметров.
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
private Integer id;
@NotBlank(message = "学生名字不能为空")
@Length(min = 2, max = 10, message = "name 长度必须在 {min} - {max} 之间")
private String name;
@NotNull(message = "年龄不允许为空")
@Min(value = 0, message = "年龄不能低于 {value} 岁")
private Integer age;
}
Уровень контроллера
Написал два метода, один для проверки общих параметров и один для проверки объектов
@Validated //开启数据校验,添加在类上用于校验方法,添加在方法参数中用于校验参数对象。(添加在方法上无效)
@RestController
@RequestMapping("/student")
public class ValidateOneController {
/**
* 普通参数校验
* @param name
* @return
*/
@GetMapping("/name")
public String findStudentByName(@NotBlank(message = "学生名字不能为空")
@Length(min = 2, max = 10, message = "name 长度必须在 {min} - {max} 之间")String name){
return "success";
}
/**
* 对象校验
* @param student
* @return
*/
@PostMapping("/add")
public String addStudent(@Validated @RequestBody Student student){
return "success";
}
}
Почтальон тест
Проверьте результаты проверки общих параметров:
Как видно на рисунке ниже, я не добавлял параметр name после адреса http://localhost:8080/student/name, и исключение было проверено сразу после его отправки в фон. И эта информация об исключении является информацией об исключении проверки, которую я определил.
Проверьте результаты проверки объекта:
Результат немного длинный:
Как вы можете видеть на рисунке ниже, я посетил http://localhost:8080/student/add и передал объект параметра, но объект не может пройти правила проверки.Например, параметр возраста является отрицательным числом, а Параметр name слишком длинный. Он будет немедленно отправлен в фоновый режим. Проверьте исключение. И эта информация об исключении является информацией об исключении проверки, которую я определил.
полный код
https://github.com/turoDog/Demo/tree/master/springboot_validateone_demo
Если вы считаете, что это полезно для вас, пожалуйста, поставьте звезду и уходите, большое спасибо.
послесловие
Если эта статья поможет вам хоть немного, пожалуйста, помогите. Твоя внешность мотивирует меня продолжать писать.
Кроме того, я отправляю его после того, как обратил внимание1024Доступны бесплатные учебные материалы.
Подробнее см. в этой старой статье:Python, C++, Java, Linux, Go, внешний интерфейс, алгоритм обмена данными