SpringBoot Combat (15) | Одна из проверок параметров на стороне сервера

Spring Boot

предисловие

Подсчитано, что многие друзья думают, что за проверку параметров отвечает клиент, а не сервер. На самом деле это неправильно: любой, кто изучал веб-безопасность, знает, что аутентификация на стороне клиента — это только первая контрольная точка. Проверка его параметров небезопасна.Как только кто-то с намерениями поймает возможность, он может иметь различные методы для имитации 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).
@Email Аннотированный параметр должен быть адресом электронной почты.
@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, внешний интерфейс, алгоритм обмена данными

一个优秀的废人