-
Spring Boot. @PathVariable with a dot(.) gets truncated개발 기록 2023. 7. 3. 16:21728x90
이 내용은 스프링 문서에 있는 내용의 요약이다.
https://www.baeldung.com/spring-mvc-pathvariable-dot
@PathVariable은 컨트롤러에서 사용되는 어노테이션이다.
// ex. controller @GetMapping("{email}") public ResponseEntity<UserInfo> getByEmail(@PathVariable String email) { System.out.println(email); return ResponseEntity.ok(email); }
문제는 이메일과 같은 dot(.)을 포함하는 문자열이 들어가면 원하는대로 작동하지 않는다.
(.) 이후의 문자열은 사라진다.
- abc@abc.com => abc@abc
어떻게 해야할까?
스프링 문서에 답이 있다.
해결
// 1. 정규식 맵핑 @GetMapping("{email:.+}") // 2. 끝에 '/' 추가 @GetMapping("{email}/") // 3. configuration 설정(전체 적용이 필요한 경우) // 스프링 문서의 예제 입니다. @Configuration public class CustomWebMvcConfigurationSupport extends WebMvcConfigurationSupport { @Override protected PathMatchConfigurer getPathMatchConfigurer() { PathMatchConfigurer pathMatchConfigurer = super.getPathMatchConfigurer(); pathMatchConfigurer.setUseSuffixPatternMatch(false); return pathMatchConfigurer; } }
1번의 경우: controller만 수정해주면 된다.
2번의 경우: 해당 api를 호출하는 쪽에서도 끝에 '/'를 붙여주어야 한다.
3번의 경우: 전체 적용이 필요한 경우 사용.
추가.
스프링 버전 5.3 이후로는 따로 설정하지 않아도 (.)이 후가 사라지는 문제는 해결된 듯하다. (테스트 해보지는 않았다)
(https://www.baeldung.com/spring-mvc-pathvariable-dot 3.1의 내용)3.1. Deprecation Notice
As of Spring Framework 5.2.4, the setUseSuffixPatternMatch(boolean) method is deprecated in order to discourage the use of path extensions for request routing and content negotiation. Basically, the current implementation makes it hard to protect web applications against the Reflected File Download (RFD) attack.
Also, as of Spring Framework 5.3, the suffix pattern matching will only work for explicitly registered suffixes, to prevent arbitrary extensions.
The bottom line is, as of Spring 5.3, we won't need to use the setUseSuffixPatternMatch(false) since it's disabled by default.728x90반응형'개발 기록' 카테고리의 다른 글
Spring Boot. How to get custom header value using @RequestHeader (0) 2023.08.31 Spring Boot. GoogleIdTokenVerifier's parameters(HttpTransport, JsonFactory) : How to know that? (0) 2023.08.10 MySQL. 'Select tables optimized away' vs 'Using index' (0) 2023.06.30 MyBatis. BindingException: parameter '~~' not found (0) 2023.05.31 MongoDB. upsert multi (0) 2023.05.18