데이터 확인은 대화형 웹사이트에 없어서는 안 될 기능입니다. 프런트엔드 js 확인은 사용자 이름 고유성, 생일 형식, 이메일 형식 확인 등과 같은 대부분의 확인 책임을 다룰 수 있습니다. 그러나 사용자가 브라우저를 우회하고 http 도구를 사용하여 백엔드에서 일부 불법 데이터를 직접 요청하는 것을 방지하려면 불법 이메일 형식이 나타나는 경우 더러운 데이터가 데이터베이스에 들어가는 것을 방지하기 위한 서버 측 데이터 확인도 필요합니다. 데이터베이스 운영 및 유지 관리 담당자에게도 골치 아픈 일이 될 것입니다. 이 문서에 설명된 유효성 검사를 사용하여 데이터를 확인할 수 있습니다.
1.JSR303/JSR-349: JSR303은 사양만 제공하지만 구현은 제공하지 않습니다. 즉, @Null, @NotNull과 같은 검증 주석을 규정합니다. @Pattern, javax.validation.constraints 패키지 아래에 있습니다. JSR-349는 몇 가지 새로운 기능이 추가된 업그레이드 버전입니다.
@Null 주석이 달린 요소는 null이어야 합니다
@NotNull 주석이 달린 요소는 null이 아니어야 합니다
@AssertTrue 주석이 달린 요소는 true여야 합니다
@AssertFalse 주석이 달린 요소는 false여야 합니다.
@Min(value) 주석이 달린 요소는 숫자여야 하며 해당 값은 지정된 최소값보다 크거나 같아야 합니다.
@Max(value) 주석이 달린 요소는 숫자여야 하며 해당 값은 다음과 같아야 합니다. 지정된 최대값보다 작거나 같음
@DecimalMin(value) 주석이 달린 요소는 숫자여야 하며 해당 값은 지정된 최소값
@DecimalMax(value)보다 크거나 같아야 합니다. 주석이 달린 요소는 숫자여야 하며 해당 값은 지정된 최대값
@Size(max, min)보다 작거나 같아야 합니다. 주석이 달린 요소의 크기는 지정된 범위
@Digits( 정수, 분수) 주석이 달린 요소는 값이 허용 가능한 범위 내에 있어야 하는 숫자여야 합니다
@Past 주석이 달린 요소는 과거 날짜여야 합니다
@Future 주석이 달린 요소는 미래 날짜여야 합니다
@ 패턴(값) 주석이 달린 요소는 지정된 정규식을 준수해야 합니다
2.hibernate 검증: 최대 절전 검증은 이 사양의 구현이며 @Email, @Length, @ Range와 같은 다른 검증 주석을 추가합니다. , etc.
@Email 주석이 달린 요소는 이메일 주소여야 합니다
@Length 주석이 달린 문자열의 크기는 지정된 범위 내에 있어야 합니다
@NotEmpty 주석이 달린 문자열은 비어 있지 않아야 합니다
@Range 주석이 달린 요소는 적절한 범위 내에 있어야 합니다
3.spring 유효성 검사: spring 유효성 검사는 최대 절전 모드 유효성 검사를 다시 캡슐화하고 springmvc 모듈에 자동 유효성 검사를 추가하며 확인 정보는 특정 클래스에 캡슐화됩니다
spring-web 모듈은 hibernate-validation을 사용하고, databind 모듈도 이에 상응하는 데이터 바인딩 기능을 제공합니다.
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
spring-boot-starter-web 종속성만 도입하면 됩니다. 해당 하위 종속성을 살펴보면 다음 종속성을 찾을 수 있습니다.
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency>
@SpringBootApplication public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); System.out.println("Start app success."); } }
public class Person { @NotEmpty(message = "name不能为空") private String name; @Range(min = 0, max = 100, message = "age不能大于100小于0") private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
springmvc에서 데이터 검증을 하면 폼 매개변수를 자동으로 캡슐화하는 기능을 제공하는데, 매개변수 검증이 추가된 일반적인 컨트롤러는 다음과 같습니다.
@RequestMapping("/test") public String valid(@Validated Person person, BindingResult bindingResult) { if (bindingResult.hasErrors()) { for (FieldError fieldError : bindingResult.getFieldErrors()) { System.out.println(fieldError); } return "fail"; } return "success"; }
주의할 점:
Persison 매개변수 앞에 @Validated 주석을 추가해야 합니다. 이는 Spring이 이를 확인해야 함을 나타내며 확인 정보는 후속 BindingResult에 저장됩니다. 확인해야 할 매개변수가 여러 개 있으면 형식은 다음과 같을 수 있습니다. valid(@Validated Person person, BindingResult personBindingResult, @Validated Person2 person2, BindingResult person2BindingResult); 즉, 하나의 검증 클래스가 하나의 검증 결과에 대응됩니다.
검증 결과는 자동으로 입력되며, 오류 페이지로 점프하는 등 컨트롤러의 비즈니스 로직을 기반으로 특정 작업을 결정할 수 있습니다.
가장 기본적인 확인이 완료되었습니다.
컨테이너를 시작하면 테스트 결과는 다음과 같습니다.
'age' 필드의 'person' 개체에 필드 오류가 있습니다.: 거부된 값 [Range. person.age,Range.age,Range.int,Range]; 인수 [org.springframework.context.support.DefaultMessageSourceResolvable: 코드 [person.age,age]; 기본 메시지 []; ; 기본 메시지 [age는 100보다 크고 0보다 작을 수 없습니다.]
확인 오류를 처리하는 이전 방법은 약간 복잡하며 대부분의 웹사이트는 통합 404 페이지에 요청 오류를 캡슐화합니다. 데이터 확인이 성공하지 못했습니다. 통과하면 Spring 부팅에서 BindException 예외가 발생합니다. 이 예외를 포착하고 Result를 사용하여 반환 결과를 캡슐화할 수 있습니다. 예외 포착 클래스를 정의하려면 @RestControllerAdvice를 사용하세요.
컨트롤러 클래스:
@RequestMapping(value = "valid", method = RequestMethod.GET) public String valid(@Validated Person person) { System.out.println(person); return "success"; }
통합 예외 처리 클래스:
@RestControllerAdvice public class BindExceptionHanlder { @ExceptionHandler(BindException.class) public String handleBindException(HttpServletRequest request, BindException exception) { List<FieldError> allErrors = exception.getFieldErrors(); StringBuilder sb = new StringBuilder(); for (FieldError errorMessage : allErrors) { sb.append(errorMessage.getField()).append(": ").append(errorMessage.getDefaultMessage()).append(", "); } System.out.println(sb.toString()); return sb.toString(); } }
테스트: http://localhost:8080/valid?age=105&name=steven
输出:age: age不能大于100小于0,
@Documented @Constraint(validatedBy = NameValidationValidator.class) @Target({ElementType.METHOD, ElementType.FIELD}) @Retention(RUNTIME) public @interface NameValidation { String message() default "不是合法的名字"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; @Target({PARAMETER, ANNOTATION_TYPE}) @Retention(RUNTIME) @Documented @interface List { NameValidation[] value(); } }
public class NameValidationValidator implements ConstraintValidator<NameValidation, String> { @Override public boolean isValid(String value, ConstraintValidatorContext context) { if ("steven".equalsIgnoreCase(value)) { return true; } String defaultConstraintMessageTemplate = context.getDefaultConstraintMessageTemplate(); System.out.println("default message :" + defaultConstraintMessageTemplate); //禁用默认提示信息 //context.disableDefaultConstraintViolation(); //设置提示语 //context.buildConstraintViolationWithTemplate("can not contains blank").addConstraintViolation(); return false; } }
@NotEmpty(message = "name不能为空") @NameValidation private String name;
测试: http://localhost:8080/valid?age=105&name=lxy
输出:age: age不能大于100小于0, name: 不是合法的名字,
위 내용은 SpringBoot가 검증을 사용하여 우아한 검증 매개변수를 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!