티스토리 뷰
서버에서 Get Parameter를 받을때 쿼리로 받게 된다. 예로들면 아래처럼 @PathVariable을 사용하는 경우..
@GetMapping(value = "/test/{path}")
public String testGetMethod(@PathVariable(name = "path") String path) {
return response.ok(path);
}
하지만 이 방법으로는 파라미터를 받을때 URL에 특수문자가 포함되어 있을 경우 특수문자 뒤는 잘리게 된다.
사용불가능한 특수문자는 +와 & 이다.
+와 &는 Get 요청에서 지정된 예약 문자이기 때문에 사용할 수 없다.
@GetMapping(value = "/test/{path}")
public String testGetMethod(@RequestParam(value = "path") String path) {
return response.ok(path);
}
@RequestParam을 사용하는 경우도 마찬가지다.
특수문자 +는 띄어쓰기로 대체되고 &가 들어가면 아예 쿼리가 나뉘게 된다.
파라미터에 특수문자가 안 들어가면 문제가 없겠지만, 특수문자를 반드시 포함해서 조회를 해야할 경우에는 따로 처리가 필요하다.
해결법 1
아래 path에 {path:.+} 같이 :.+ 특수문자를 포함하면 +와 &를 포함하여 파라미터를 매핑할 수 있다.
@GetMapping(value = "/test/{path:.+}")
public String testGetMethod(@PathVariable(name = "path") String path) {
return response.ok(path);
}
하지만 문제가 있다. 특수문자 +와 &는 처리가 되지만
만약 특수문자에 /(슬러시)가 포함되어 있으면 슬러시 뒷 부분은 다른 path로 인식하여 잘리게 된다
해결법 2
그럼 슬러시도 포함하여 파라미터를 받는 방법은 있는 걸까? 이 부분은 의존성 도움 없이 수동으로 받을 수 밖에 없다.
@GetMapping(value = "/test/**")
public String testGetMethod(HttpServletRequest request) {
String path
= request.getRequestURI().split(request.getContextPath()+"/test/")[1];
return response.ok(path);
}
path 값을 "test/**"로 설정하여 test 뒤에 오는 모든 URL path를 받아 split으로 잘라서 사용한다.
이럴경우 슬러시를 연속으로(//) 포함하는 경우도 사용할 수 있다.
결론
사실은 path에 특수문자가 포함되지 않는 것이 제일 베스트다. 특수문자를 위해서 해결법2와 같은 URL 방법을 사용할 시 보안이나 디자인 패턴 철학에 맞지 않는다고 할 수 있다. 보통 슬래시와 같은 특수문자들은 암호화하여 서버에서 디코딩으로 받는 것을 추천하고 있다. 아파치 서버와 그 외 서버의 경우 슬래시도 자동으로 인식하도록 업데이트 되고 있다지만 결국 이런 방법은 보안을 무시하는 방법으로 사용하기 좋지 않다.
'Web > Spring' 카테고리의 다른 글
[Spring] Spring Boot 배너 만드는 법 (0) | 2023.01.13 |
---|---|
[Spring] Oracle DB 연결 테스트, Mybatis연동(1) (3) | 2018.05.22 |
[Spring] Spring 설치방법, 톰캣 서버 연결, 디렉토리 구조 (1) | 2018.05.17 |
[Spring] 메이븐(Maven)이란? (1) | 2018.05.17 |
[Spring] Spring 이란? (2) | 2018.05.16 |