복붙노트

[SPRING] Spring 3 MVC 요청 유효성 검사

SPRING

Spring 3 MVC 요청 유효성 검사

스프링 3.2 애플리케이션이 있고 토큰 기반 보안을 사용하는 REST API를 만들었습니다. 모든 REST JSON 페이로드에는 보안 유효성 검사를 수행하는 데 사용되는 "토큰"필드가 있습니다.

컨트롤러 메소드는 다음과 같습니다.

@RequestMapping(value = "/something", method = RequestMethod.POST)
public
@ResponseBody
Map something(@RequestBody SomethingParams params) {
}

SomethingParams에는 토큰 필드가 있으며 요청의 JSON 본문에서 Spring에 의해 자동으로 채워집니다.

SomethingParams와 같은 매개 변수에 유효한 토큰이 있는지 확인하기 위해 모든 컨트롤러 메서드에서 유효성 검사기를 자동으로 호출하는 방법이 있습니까?

이전에는 인터셉터를 사용했으며 토큰은 쿼리 문자열에 포함되었지만 이제는 요청 본문에 있기 때문에 인터셉터에서 JSON을 구문 분석하여 확인해야합니다. Spring은 이미 매개 변수를 바인딩하기 위해 JSON을 구문 분석하므로 더 똑똑한 방법이 있는지 궁금합니다. 일부 전역 또는 컨트롤러 수준 설정 (메서드 별이 아님) 이상적입니다.

해결법

  1. ==============================

    1.그런 경우에는 봄철 Validator를 사용할 수 있습니다.

    그런 경우에는 봄철 Validator를 사용할 수 있습니다.

    @Component
    public class SomethingParamsValidator implements Validator {
      @Override
      public boolean supports(Class<?> clazz) {
        return clazz.isAssignableFrom(SomethingParams.class);
      }
    
      @Override
      public void validate(Object o, Errors errors) {
        SomethingParams sp = (SomethingParams)o;
        validateToken(sp.getToken(), errors);
      }
    
      private void validateToken(String token, Errors errors) {
        if (!TokenUtils.isValid(token)) {
          errors.rejectValue("token", "foo", "Token is invalid");
        }
      }
    }
    

    그런 다음 컨트롤러에 다음 방법을 추가하여 등록합니다

    @Autowired
    SomethingParamsValidator somethingParamsValidator;
    
    @InitBinder
    protected void initBinder(WebDataBinder binder) {
        binder.setValidator(somethingParamsValidator);
    }
    

    마지막으로 SomethingParams 객체의 @Valid 주석을 추가하면 유효성이 검사됩니다.

    @RequestMapping(value = "/something", method = RequestMethod.POST)
    public @ResponseBody Map something(@Valid @RequestBody SomethingParams params) {
        // ...
    }
    
  2. ==============================

    2.토큰 필드가 JSR-303 @NotNull로 주석 된 기본 클래스를 만들고이 클래스에서 확장 할 수 있습니다.

    토큰 필드가 JSR-303 @NotNull로 주석 된 기본 클래스를 만들고이 클래스에서 확장 할 수 있습니다.

    public class ParamsBase {
      @NotNull
      private String token;
      // getters, setters ...
    }
    public class SomethingParams extends ParamsBase {...}
    

    그리고 매개 변수를 @Valid로 표시하십시오.

    @RequestMapping(value = "/something", method = RequestMethod.POST)
    public @ResponseBody Map something(@Valid @RequestBody SomethingParams params) {
        // ...
    }
    

    Spring은 런타임에 사용 가능한 JSR-303 구현으로 매개 변수의 유효성을 자동으로 검사합니다.

    보통 구현 프로 바이더로서 hibernate-validator를 사용한다.

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>5.0.1.Final</version>
    </dependency>
    
  3. ==============================

    3.또한 모든 컨트롤러 메소드를 가로 채고 매개 변수의 유효성을 검사하는 자체 Aspect를 구현할 수 있습니다. 이렇게하면 @Valid 주석을 없앨 수 있습니다. 그러나 불행히도 나는 완전한 예를 들기위한 시간이 없다.

    또한 모든 컨트롤러 메소드를 가로 채고 매개 변수의 유효성을 검사하는 자체 Aspect를 구현할 수 있습니다. 이렇게하면 @Valid 주석을 없앨 수 있습니다. 그러나 불행히도 나는 완전한 예를 들기위한 시간이 없다.

  4. from https://stackoverflow.com/questions/16544265/spring-3-mvc-request-validation by cc-by-sa and MIT license