1. 개요

이 짧은 예제에서는 Spring MVC로 작업 할 때의 일반적인 문제에 대해 논의 할 것 입니다. @RequestMapping 과 함께 Spring @PathVariable사용하여 점이 포함 된 요청 URI의 끝을 매핑 할 때 부분 값으로 끝납니다. 변수에서 마지막 점에서 잘립니다.

다음 섹션에서는 이런 일이 발생하는 이유와이 동작을 변경하는 방법에 초점을 맞출 것입니다.

Spring MVC에 대한 소개 는이 기사 를 참조 하십시오 .

2. 원하지 않는 스프링 도움말

프레임 워크는 경로 변수를 해석하는 방식 때문에 종종 원치 않는 동작을 유발합니다.

특히 Spring은 마지막 점 뒤에있는 모든 것이 .json 또는 .xml 과 같은 파일 확장자라고 간주합니다 .

결과적으로 매개 변수를 검색하기 위해 값을 자릅니다.

경로 변수를 사용하는 예를 살펴본 다음 가능한 다른 값으로 결과를 분석해 보겠습니다.

@RestController
public class CustomController {
    @GetMapping("/example/{firstValue}/{secondValue}")
    public void example(@PathVariable("firstValue") String firstValue,
      @PathVariable("secondValue") String secondValue) {
        // ...  
    }
}

위의 예를 통해 다음 요청을 고려하고 변수를 평가 해 보겠습니다.

  • URL 예제 / 갤러리 / 링크firstValue = "gallery"및 secondValue = "link"를 평가합니다.
  • example / gallery.df / link.ar URL을 사용하면 firstValue = "gallery.df"및 secondValue = "link"가됩니다.
  • 예 / gallery.df / link.com.ar URL, 우리의 변수가 될 것입니다 : firstValue = "gallery.df"및 secondValue = "link.com"

보시다시피 첫 번째 변수는 영향을받지 않지만 두 번째 변수는 항상 잘립니다.

3. 솔루션

이 불편 함을 해결하는 한 가지 방법 은 정규식 매핑을 추가하여 @PathVariable 정의수정하는 것 입니다. 따라서 마지막 점을 포함하여 모든 점이 매개 변수의 일부로 간주됩니다.

@GetMapping("/example/{firstValue}/{secondValue:.+}")   
public void example(
  @PathVariable("firstValue") String firstValue,
  @PathVariable("secondValue") String secondValue) {
    //...
}

이 문제를 피하는 또 다른 방법은 @PathVariable 끝에 슬래시를 추가하는 것 입니다. 이것은 Spring의 기본 동작으로부터 보호하는 두 번째 변수를 포함합니다.

@GetMapping("/example/{firstValue}/{secondValue}/")

위의 두 솔루션은 수정중인 단일 요청 매핑에 적용됩니다.

전역 MVC 수준에서 동작을 변경하려면 사용자 지정 구성을 제공해야합니다 . 이를 위해 WebMvcConfigurationSupport를 확장 하고 getPathMatchConfigurer () 메서드를 재정 의하여 PathMatchConfigurer 를 조정할 수 있습니다.

@Configuration
public class CustomWebMvcConfigurationSupport extends WebMvcConfigurationSupport {

    @Override
    protected PathMatchConfigurer getPathMatchConfigurer() {
        PathMatchConfigurer pathMatchConfigurer = super.getPathMatchConfigurer();
        pathMatchConfigurer.setUseSuffixPatternMatch(false);

        return pathMatchConfigurer;
    }
}

이 접근 방식은 모든 URL에 영향을 미친다는 점을 기억해야합니다.

이 세 가지 옵션을 사용하면 동일한 결과를 얻을 수 있습니다. example / gallery.df / link.com.ar URL을 호출 할 때 secondValue 변수는 우리가 원하는 "link.com.ar"로 평가됩니다.

3.1. 지원 중단 알림

스프링 프레임 워크 현재 5.2.4 , setUseSuffixPatternMatch (부울) 메소드는 요청 라우팅 및 내용 협상에 대한 경로 확장의 사용을 억제하기 위해 사용되지 않습니다. 기본적으로 현재 구현은 RFD (Reflected File Download) 공격 으로부터 웹 애플리케이션을 보호하기 어렵게 만듭니다 .

또한 Spring Framework 5.3부터는 랜덤의 확장을 방지하기 위해 명시 적으로 등록 된 접미사에 대해서만 접미사 패턴 일치가 작동합니다.

결론은 Spring 5.3 부터 기본적으로 비활성화되어 있으므로 setUseSuffixPatternMatch (false)  를 사용할 필요가 없다는 것  입니다.

4. 결론

이 빠른 글에서 우리는 Spring MVC에서 @PathVariable@RequestMapping 과이 문제의 원인을 다룰 때 일반적인 문제를 해결하는 다양한 방법을 탐색했습니다 .

항상 그렇듯이 예제의 전체 소스 코드는 GitHub에서 사용할 수 있습니다 .