SpringBootパラメータチェック

7878 ワード

フロントエンドでデータを検証する場合でも、ユーザーがブラウザを迂回してHTTPツールを通じて直接バックエンドに違法なデータを要求することを避けるために、バックエンドに転送されたデータをもう一度検証します.
一、環境構築
1、依存
	
   	  UTF-8
   	  1.8
  	  1.8
  	
  
	
  	  org.springframework.boot
      spring-boot-starter-parent
  	  2.1.6.RELEASE
    
  
	
      
        org.projectlombok
        lombok
        1.18.8
      
      
        org.springframework.boot
        spring-boot-starter-web
      
   

2、実体クラス
import lombok.*;

import javax.validation.constraints.Email;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;

@Setter
@Getter
@ToString
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
public class Person {
    private Integer id;

    @NotNull(message = "classId    ")
    private String classId;

    @Size(max = 4)
    @NotNull(message = "name    ")
    private String name;

    /**
     *        :
     * - ^string :     string       
     * - string$ :    string       
     * - ^string$ :     string    
     * - ((^Man$|^Woman$|^UGM$)) :      Man,Woman,UGM        
     */
    @Pattern(regexp = "((^Man$|^Woman$|^UGM$))",message = "sex       ")
    @NotNull(message = "sex    ")
    private String sex;

    @Email(message = "email     ")
    @NotNull(message = "email    ")
    private String email;
}

2.1 JSRが提供する検証注釈:
  • @Null注釈された要素はnull
  • である必要がある.
  • @NotNull注釈された要素はnull
  • でない必要がある.
  • @AssertTrue注釈された要素はtrue
  • である必要がある.
  • @AssertFalse注釈された要素はfalse
  • である必要がある.
  • @Min(value)注釈された要素は、指定する最小値
  • 以上の値でなければならない数字でなければならない.
  • @Max(value)注釈された要素は、指定する最大値
  • 以下の値でなければならない数字でなければならない.
  • @DecimalMin(value)注釈された要素は、指定する最小値
  • 以上の値でなければならない数字でなければならない.
  • @DecimalMax(value)注釈された要素は、指定する最大値
  • 以下の値でなければならない数字でなければならない.
  • @Size(max=, min=)注釈された要素のサイズは、指定する範囲内である必要がある
  • .
  • @Digits (integer, fraction)注釈された要素は数値である必要があり、その値は許容範囲内である必要がある
  • .
  • @Past注釈された要素は、過去の日付
  • である必要がある.
  • @Future注釈された要素は、将来の日付
  • である必要がある.
  • @Pattern(regex=,flag=)注釈された要素は、指定された正規表現
  • に適合する必要がある.
    2.2 Hibernate Validatorが提供する検証注記:
  • @NotBlank(message =)検証文字列はnullではなく、長さは0
  • より大きくなければならない.
  • @Email注釈された要素は、電子メールアドレス
  • である必要がある.
  • @Length(min=,max=)注釈された文字列のサイズは、指定する範囲内である必要がある
  • .
  • @NotEmpty注釈文字列の必須非空
  • @Range(min=,max=,message=)注釈された要素は、適切な範囲内である必要がある
  • .
    二、Controllerの入力を検証する
    1.検証要求体(RequestBody)
    Controller:
    検証が必要なパラメータに@Valid注記を加え,検証に失敗するとMethodArgumentNotValidExceptionを放出する.Springは、デフォルトでこの例外をHTTP Status 400(エラーリクエスト)に変換します.
    @RestController
    @RequestMapping("/api")
    public class PersonController {
        @PostMapping("/person")
        public Person getPerson(@RequestBody @Valid Person person) {
            return person;
        }
    }
    

    ExceptionHandler:
    カスタム例外プロセッサは、例外をキャプチャし、簡単な処理を行うのに役立ちます.
    import org.springframework.http.HttpStatus;
    import org.springframework.http.ResponseEntity;
    import org.springframework.validation.FieldError;
    import org.springframework.web.bind.MethodArgumentNotValidException;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    
    import java.util.HashMap;
    import java.util.Map;
    
    @ControllerAdvice
    public class GlobalExceptionHandler {
        @ExceptionHandler(MethodArgumentNotValidException.class)
        public ResponseEntity> handleValidationExceptions(MethodArgumentNotValidException ex) {
            HashMap errors = new HashMap<>();
            ex.getBindingResult().getAllErrors().forEach((error) -> {
                //   
                String fieldName = ((FieldError) error).getField();
                //    
                String errorMessage = error.getDefaultMessage();
                errors.put(fieldName, errorMessage+"     ");
            });
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errors);
        }
    }
    

    postmanテストの使用
    SpringBoot参数校验_第1张图片
    2.検証要求パラメータ(Path VariablesとRequest Parameters)
    Controller:
    クラスに@Validated注記を付けることを忘れないでください.このパラメータはSpringにメソッドパラメータを検証することを教えてくれます.(検証リクエストボディ(RequestBody)クラスに@Validatedを付ける必要はありません)
    import org.springframework.validation.annotation.Validated;
    import org.springframework.web.bind.annotation.*;
    
    import javax.validation.Valid;
    import javax.validation.constraints.Max;
    import javax.validation.constraints.Size;
    
    @RestController
    @RequestMapping("/api1")
    @Validated
    public class PersonController1 {
        @PostMapping("/person/{id}")
        public String getId(@PathVariable @Valid @Max(value = 5, message = ("        ")) Integer id) {
            return "id : " + id;
        }
    
        @PostMapping("/person/name")
        public String getName(@RequestParam @Valid @Size(min = 1, max = 5, message = ("     1 5  ")) String name) {
            return "name : " + name;
        }
    }
    

    2.1 idパラメータに注記@Max(value=5、message=(「範囲外の数値サイズ」)を付けると、制限パラメータidの最大値が5になることを示します.
    SpringBoot参数校验_第2张图片
    2.2 nameパラメータの前に注記@Size(min=1,max=5,message=(「長さは1から5の間である必要がある」)は制限パラメータnameの長さが最小で1,最大で5エンティティークラスPersonのフィールドnameの@Size(max=4)は制限フィールドnameの長さが最大で4エンティティークラスのフィールドとメソッドパラメータの両方に制限があることを示し,メソッドパラメータの優先度が高い
    SpringBoot参数校验_第3张图片
    三、サービスの検証方法
    また、コントローラレベルの入力を検証するのではなく、Springコンポーネントの入力を検証することもできます.@Validated@Validの注釈の組み合わせを使用して、このニーズを実現することができます.
    @RestController
    @RequestMapping("/api2")
    public class PersonController2 {
        @Autowired
        private PersonService personService;
    
        @PostMapping("/person")
        public Person getPerson(@RequestBody Person person) {
            return personService.getPerson(person);
        }
    }
    
    @Service
    @Validated
    public class PersonService {
        public Person getPerson(@Valid Person person){
            return person;
        }
    }
    

    SpringBoot参数校验_第4张图片