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 과이 문제의 원인을 다룰 때 일반적인 문제를 해결하는 다양한 방법을 탐색했습니다 .