springMVC 는 입력 데이터 검증 실현 코드 를 어떻게 합 니까?

머리말
데이터 의 검증 은 상호작용 사이트 의 불가 또는 부족 한 기능 으로 데이터 검증 은 클 라 이언 트 검증 과 서버 측 검증 으로 나 뉜 다.전단 의 js 검 사 는 사용자 이름 의 유일 성,생일 형식,메 일 형식 검사 등 대부분의 검사 직책 을 포함 할 수 있 습 니 다.그러나 사용자 가 브 라 우 저 를 돌아 가지 않도록 http 도 구 를 사용 하여 백 엔 드 에 불법 데 이 터 를 직접 요청 합 니 다.서버 의 데이터 검증 도 필요 합 니 다.더러 운 데이터 가 데이터 베이스 에 떨 어 지 는 것 을 방지 할 수 있 습 니 다.만약 에 데이터 베이스 에 불법 메 일 형식 이 나타 나 면 운영 자 들 을 골 치 아 프 게 할 수 있 습 니 다.서버 측 검증 은 전체 응용 프로그램 이 불법 데 이 터 를 막 는 마지막 방어선 입 니 다.응용 프로그램 에서 프로 그래 밍 을 통 해 이 루어 집 니 다.
클 라 이언 트 인증 은 대부분의 경우 자바 스 크 립 트 를 사용 하여 클 라 이언 트 인증 을 하 는 절 차 는 다음 과 같 습 니 다.
검증 함 수 를 작성 합 니 다
  • 양식 을 제출 한 이벤트 에서 인증 함 수 를 호출 합 니 다
  • 4.567917.검증 함수 에 따라 폼 제출 여 부 를 판단 합 니 다서버 측 검증 은 시스템 의 안전성,완전 성,건장 성에 중요 한 역할 을 한다.서버 측 에서 Spring MVC 의 Converter 와 Formatter 가 형식 변환 을 할 때 입력 데 이 터 를 영역 대상 의 속성 값(자바 형식)으로 변환 하 는 것 을 검증 하 는데 성공 하면 서버 측 검증 기 가 개입 합 니 다.스프링 MVC 프레임 워 크 에서 데이터 형식 변환 을 먼저 한 뒤 서버 측 검증 을 하 겠 다 는 것 이다.Spring MVC 프레임 워 크 에 서 는 Spring 자체 검증 프레임 워 크 를 활용 해 데 이 터 를 검증 할 수도 있 고 JSR 303 을 이용 해 데이터 검증 을 할 수도 있다.
    JSR 303/JSR-349,hibenate validation,spring validation 간 의 관계
    JSR 303 은 표준 입 니 다.JSR-349 는 업그레이드 버 전 입 니 다.새로운 기능 을 추 가 했 습 니 다.그들 은 일부 검증 규범 즉 검증 주 해 를 규정 합 니 다.예 를 들 어@Null,@NotNull,@Pattern 은 자바 x.vaidation.constraints 가방 에 있 고 규범 만 제공 하고 실현 되 지 않 습 니 다.한편,hibenate vaidation 은 이 규범 에 대한 실천(hibenate 와 데이터베이스 orm 프레임 워 크 를 연결 하지 마 십시오)입 니 다.그 는 해당 하 는 실현 을 제공 하고 다른 검증 주 해 를 추 가 했 습 니 다.예 를 들 어@Email,@Length,@Range 등 은 org.hibenate.vaidator.constraints 가방 에 있 습 니 다.한편,만능 spring 은 개발 자 에 게 편리 함 을 제공 하기 위해 hibenate vaidation 을 2 차 로 패 키 징 했 습 니 다.검증 vaidated bean 을 표시 할 때 spring vaidation 이나 hibenate vaidation 을 사용 할 수 있 습 니 다.spring vaidation 의 또 다른 기능 은 springmvc 모델 에 자동 검증 을 추가 하고 검증 정 보 를 특정한 클래스 에 패키지 하 는 것 입 니 다.이것 은 의심 할 여지없이 우리 의 웹 개발 을 편리 하 게 했다.본 고 는 주로 springmvc 에서 자동 으로 검사 하 는 메커니즘 을 소개 한다.
    springMVC 입력 데이터 검증 실현
    우선 Maven 프로젝트 에 관련 jar 패 키 지 를 도입 합 니 다.
    
    <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator -->
    <dependency>
     <groupId>org.hibernate.validator</groupId>
     <artifactId>hibernate-validator</artifactId>
     <version>6.0.13.Final</version>
    </dependency>
    <dependency>
     <groupId>javax.validation</groupId>
     <artifactId>validation-api</artifactId>
     <version>2.0.1.Final</version>
    </dependency>
    <dependency>
     <groupId>javax.el</groupId>
     <artifactId>javax.el-api</artifactId>
     <version>3.0.0</version>
    </dependency>
    spring 의 Valid 기능 열기
    
    <mvc:annotation-driven />
    검 증 될 실체 클래스 만 들 기
    
    import org.hibernate.validator.constraints.Length;
    import javax.validation.constraints.Email;
    import javax.validation.constraints.NotBlank;
    import javax.validation.constraints.Pattern;
    
    //     users  
    public class UserInfo {
      private int id;
      @Pattern(regexp = Constants.USERNAMR, message = Constants.USERNAMRERROR)
      private String username;
      @NotBlank(message = Constants.NAMEERROR)
      private String name;
      @Email(message = Constants.EMAILERROR)
      private String email;
      @Length(min = 6, max = 16, message = Constants.PASSWORDERROR)
      private String password;
      @Pattern(regexp = Constants.PHONE, message = Constants.PHONEERROR)
      private String phoneNum;
      //...get/set  
    }
    이 주석 들 은 비교적 간단명료 하고 이해 하기 쉽다.필드 의 주석 이름 은 검사 내용 을 추정 할 수 있다.모든 주석 은 message 필드 를 포함 하고 있 으 며,검사 실패 시 알림 정보 로 사용 되 며,특수 한 검사 주해,예 를 들 어 Pattern(정규 검사)은 정규 표현 식 을 추가 할 수 있다.
    
    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=)                     
    
    
    Hibernate Validator       : 
    @NotBlank(message =)        null,       0  
    @Email                  
    @Length(min=,max=)                      
    @NotEmpty                
    @Range(min=,max=,message=)                
    저 희 는 message 오류 정 보 를 Constants 클래스 에 두 었 습 니 다.
    
    public class Constants {
      public static final String PHONE = "^1[3|4|5|7|8][0-9]{9}$";
      public static final String USERNAMR = "^NH[0-9]{7}$";
    
      public static final String NAMEERROR = "       ";
      public static final String PHONEERROR = "            ";
      public static final String EMAILERROR= "            ";
      public static final String USERNAMRERROR = "            ";
      public static final String PASSWORDERROR = "      6~16 ";
      public static final String DATENOTNULL = "    ";
    }
    @Controller 에서 데 이 터 를 검사 합 니 다.
    @Valid 와 BindingResult 는 일일이 대응 합 니 다.@Valid 가 여러 개 있 으 면@Valid 뒤에 따 르 는 BindingResult 가 바로 이@Valid 의 검증 결과 입 니 다.순서 가 어 지 러 워 서 는 안 됩 니 다.
    
    //    
    @RequestMapping("/save.do")
    //@PreAuthorize("authentication.principal.username == 'NH1905001'")
    @PreAuthorize("hasRole('ROLE_ADMIN')")
    public String save(@Valid @ModelAttribute(value="userInfo") UserInfo userInfo, BindingResult result) throws Exception {
      if(result.hasErrors()){
        List<FieldError> errors = result.getFieldErrors();
        for (FieldError fieldError : errors) {
    
          System.out.println("      :" + fieldError.getDefaultMessage());
          System.out.println("      ?" + fieldError.getField());
          System.out.println(fieldError);
          System.out.println("------------------------");
        }
        return "user-add";
      }else {
        userService.save(userInfo);
        return "redirect:findAll.do";
      }
    }
    오류 대상 의 대표 자 는 Errors 인터페이스 입 니 다.데이터 바 인 딩 오류 와 오류 검증 에 관 한 인 터 페 이 스 를 저장 하고 노출 하 며 관련 저장 과 오류 메 시 지 를 얻 는 방법 을 제공 합 니 다.다음 과 같은 몇 가지 실현 유형 이 있 습 니 다.
  • Binding Result:데이터 바 인 딩 결 과 를 대표 하여 Errors 인 터 페 이 스 를 계승 합 니 다
  • BindException:데이터 바 인 딩 의 이상 을 대표 합 니 다.Exception 을 계승 하고 Binding Result 를 실 현 했 습 니 다.이것 은 내부 에서 사용 하 는 오류 대상 입 니 다
  • Errors 인터페이스 에서 의 방법
    
    void addAllErrors(Errors var1);
    
    boolean hasErrors();
    
    int getErrorCount();
    
    List<ObjectError> getAllErrors();
    
    boolean hasGlobalErrors();
    
    int getGlobalErrorCount();
    
    List<ObjectError> getGlobalErrors();
    
    @Nullable
    ObjectError getGlobalError();
    
    boolean hasFieldErrors();
    
    int getFieldErrorCount();
    
    List<FieldError> getFieldErrors();
    
    @Nullable
    FieldError getFieldError();
    
    boolean hasFieldErrors(String var1);
    
    int getFieldErrorCount(String var1);
    
    List<FieldError> getFieldErrors(String var1);
    
    @Nullable
    FieldError getFieldError(String var1);
    
    @Nullable
    Object getFieldValue(String var1);
    
    @Nullable
    Class<?> getFieldType(String var1);
    방법 이름 에 따라 방법의 작용 을 알 수 있다
    출력 검사 정보
    
          :       
          ?name
    Field error in object 'userInfo' on field 'name': rejected value []; codes [NotBlank.userInfo.name,NotBlank.name,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [userInfo.name,name]; arguments []; default message [name]]; default message [       ]
    ------------------------
          :            
          ?email
    Field error in object 'userInfo' on field 'email': rejected value [111]; codes [Email.userInfo.email,Email.email,Email.java.lang.String,Email]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [userInfo.email,email]; arguments []; default message [email],[Ljavax.validation.constraints.Pattern$Flag;@462d227d,org.springframework.validation.beanvalidation.SpringValidatorAdapter$ResolvableAttribute@2a8eb300]; default message [            ]
    ------------------------
          :            
          ?username
    Field error in object 'userInfo' on field 'username': rejected value []; codes [Pattern.userInfo.username,Pattern.username,Pattern.java.lang.String,Pattern]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [userInfo.username,username]; arguments []; default message [username],[Ljavax.validation.constraints.Pattern$Flag;@63f401ef,org.springframework.validation.beanvalidation.SpringValidatorAdapter$ResolvableAttribute@72436888]; default message [            ]
    ------------------------
          :            
          ?phoneNum
    Field error in object 'userInfo' on field 'phoneNum': rejected value []; codes [Pattern.userInfo.phoneNum,Pattern.phoneNum,Pattern.java.lang.String,Pattern]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [userInfo.phoneNum,phoneNum]; arguments []; default message [phoneNum],[Ljavax.validation.constraints.Pattern$Flag;@63f401ef,org.springframework.validation.beanvalidation.SpringValidatorAdapter$ResolvableAttribute@5d528277]; default message [            ]
    ------------------------
          :      6~16 
          ?password
    Field error in object 'userInfo' on field 'password': rejected value []; codes [Length.userInfo.password,Length.password,Length.java.lang.String,Length]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [userInfo.password,password]; arguments []; default message [password],16,6]; default message [      6~16 ]
    ------------------------
    데이터 검사 오류 정보 표시
    controller 처리 방법의 형 삼 pojo 가 정의 하 는 대상 은 이 유형 과 같 습 니 다.이니셜 소문 자 입 니 다.이 때 spring 은 자동 으로 이 대상 을 key 라 고 부 릅 니 다.이 대상 을 value 로 하여 request 에 저장 할 수 있 습 니 다.물론@Valid@ModelAttribute(value="userInfo")UserInfo userInfo 를 통 해 이름 을 사용자 정의 할 수도 있 습 니 다.
    model Attribute="userInfo"에서 userInfo 는 contrller 방법의 형 삼 pojo 가 정의 하 는 대상 과 같 습 니 다.
    페이지 도입 주의
    
    <%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
    
    <form:form modelAttribute="userInfo" action="${pageContext.request.contextPath}/user/save.do"
      method="post">
      <!--      -->
      <section class="content"> <!--    -->
    
      <div class="panel panel-default">
       <div class="panel-heading">    </div>
       <div class="row data-type">
    
         <div class="col-md-2 title">    </div>
         <div class="col-md-4 data">
          <input type="text" class="form-control" name="username"
            placeholder="    " value="">
         </div>
         <div class="col-md-6 data">
          <form:errors path="username" cssStyle="color:red"/>
         </div>
         <div class="col-md-2 title">  </div>
         <div class="col-md-4 data">
          <input type="text" class="form-control" name="name"
             placeholder="  " value="">
         </div>
         <div class="col-md-6 data">
          <form:errors path="name" cssStyle="color:red"/>
         </div>
         <div class="col-md-2 title">  </div>
         <div class="col-md-4 data">
          <input type="password" class="form-control" name="password"
            placeholder="  " value="">
         </div>
         <div class="col-md-6 data">
          <form:errors path="password" cssStyle="color:red"/>
         </div>
         <div class="col-md-2 title">  </div>
         <div class="col-md-4 data">
          <input type="text" class="form-control" name="email"
            placeholder="  " value="">
         </div>
         <div class="col-md-6 data">
          <form:errors path="email" cssStyle="color:red"/>
         </div>
         <div class="col-md-2 title">    </div>
         <div class="col-md-4 data">
          <input type="text" class="form-control" name="phoneNum"
            placeholder="    " value="">
         </div>
         <div class="col-md-6 data">
          <form:errors path="phoneNum" cssStyle="color:red"/>
         </div>
         <div class="col-md-2 title">    </div>
         <div class="col-md-4 data">
          <select class="form-control select2" style="width: 100%"
            name="status">
            <option value="0" selected="selected">  </option>
            <option value="1">  </option>
          </select>
         </div>
    
       </div>
      </div>
      <!--    /--> <!--   -->
      <div class="box-tools text-center">
       <button type="submit" class="btn bg-maroon">  </button>
       <button type="button" class="btn bg-default"
         onclick="history.back(-1);">  </button>
      </div>
      <!--   /--> </section>
      <!--      /-->
    </form:form>
     
    在这里插入图片描述
    데이터 검사 오류 정보 표시 방법 2
    model 방식 으로 request 에 지정 한 key 와 value 를 저장 합 니 다.다음 과 같 습 니 다.
    
    //       
    @RequestMapping("/transformClients.do")
    public String transformClientsById(@Valid @ModelAttribute("publicSea") PublicSea publicSea, BindingResult result, Model model) throws Exception {
      if(result.hasErrors()){  
      	model.addAttribute("failueError",failueError.getDefaultMessage());
        model.addAttribute("failueDesc",publicSea.getFailueDesc());
        model.addAttribute("cNumber",publicSea.getcNumber());
        return "publicSea-change";
      }else {
        return "redirect:findAll.do";
      }
    }
    클 라 이언 트 코드
    
    <form action="${pageContext.request.contextPath}/clients/transformClients.do"
       method="post">
      <!--      -->
      <section class="content"> <!--    -->
    
       <div class="panel panel-default">
         <div class="panel-heading">      </div>
         <div class="row data-type">
          <input type="text" style="display:none" name="cNumber"
             placeholder="  Id" value="${cNumber}">
          <div class="col-md-2 title rowHeight2x">      </div>
          <div class="col-md-10 data rowHeight2x">
            <textarea class="form-control" rows="3" placeholder="      "
                name="failueDesc">${failueDesc}</textarea>
          </div>
          <div class="col-md-12 data rowHeight2x">
            <label>${failueError}</label>
          </div>
    
         </div>
       </div>
       <!--    /--> <!--   -->
       <div class="box-tools text-center">
         <button type="submit" class="btn bg-maroon">  </button>
         <button type="button" class="btn bg-default"
            onclick="history.back(-1);">  </button>
       </div>
       <!--   /--> </section>
      <!--      /-->
    </form>
    그룹 검사
    사용자 정의 검사
    수 동 검사
    방법 기반 검사
    입력 데이터 검증 에 대한 springMVC 의 방법 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 springMVC 데이터 검증 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기