@PathVariable in SpringBoot(URL 슬래시 포함)
SpringBoot 어플리케이션에서 @PathValable을 사용하여 URL에서 파라미터를 취득해야 합니다.이 가석방들은 종종 슬래시를 가지고 있다.저는 URL에 사용자가 입력하는 내용을 제어할 수 없기 때문에 사용자가 입력한 내용을 가져와 처리할 수 있도록 하고 싶습니다.
여기 자료와 답변은 이미 살펴봤지만, 사용자에게 어떻게든 입력 파라미터를 인코딩하도록 요구하는 것은 좋은 해결책이 아니라고 생각합니다.
Spring Boot 코드는 다음과 같습니다.
@RequestMapping("/modules/{moduleName}")
@ResponseBody
public String moduleStrings (@PathVariable("moduleName") String moduleName) throws Exception {
...
}
예를 들어 URL은 다음과 같습니다.
http://localhost:3000/modules/...
이 문제는 param moduleName에 슬래시가 있는 경우가 많다는 것입니다.예를들면,
metadata-api\cb-metadata-services OR
app-customization-service-impl\\modules\\expand-link-schemes\\common\\app-customization-service-api
따라서 사용자는 다음과 같이 입력할 수 있습니다.
http://localhost:3000/modules/metadata-api\cb-metadata-services
사용자가 URL에 입력한 내용을 /modules/ 뒤에 모두 가져올 수 있습니까?
누가 그런 문제를 해결할 좋은 방법을 알려준다면요.
P.J.에 기반을 두고 있다.Meish의 답변은 나의 경우를 위한 간단한 해결책에 도달했다.또한 URL 파라미터 내의 여러 슬래시를 고려할 수 있습니다.이전 답변과 같이 백슬래시도 사용할 수 없습니다.
@RequestMapping(value = "/modules/**", method = RequestMethod.GET)
@ResponseBody
public String moduleStrings(HttpServletRequest request) {
String requestURL = request.getRequestURL().toString();
String moduleName = requestURL.split("/modules/")[1];
return "module name is: " + moduleName;
}
이 코드는 완전한 경로를 가져옵니다.
@RequestMapping(value = "/modules/{moduleBaseName}/**", method = RequestMethod.GET)
@ResponseBody
public String moduleStrings(@PathVariable String moduleBaseName, HttpServletRequest request) {
final String path =
request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE).toString();
final String bestMatchingPattern =
request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE).toString();
String arguments = new AntPathMatcher().extractPathWithinPattern(bestMatchingPattern, path);
String moduleName;
if (null != arguments && !arguments.isEmpty()) {
moduleName = moduleBaseName + '/' + arguments;
} else {
moduleName = moduleBaseName;
}
return "module name is: " + moduleName;
}
import org.springframework.web.util.UriUtils;
@RequestMapping(value = "/modules/**", method = RequestMethod.GET)
@ResponseBody
public String moduleStrings(HttpServletRequest request) {
final String url = request.getRequestURL().toString();
final String modules = url.split("/modules")[1];
final String safeModules = UriUtils.decode(modules, StandardCharsets.UTF_8);
return "replaces %20 with space";
}
이거 학교 과제야?왜 자유 텍스트를 경로에 넣으려고 합니까?대신 매개 변수 변수를 사용하면 어떨까요?
사용자가 무료 텍스트가 포함된 복잡한 URL을 입력하는 것은 좋은 생각이 아닙니다.우선 사용자가 복잡한 URL을 기억하기 어렵기 때문에 사용자에게 친숙하지 않습니다.둘째, 그들은 이상한 일을 할 수 있다.
대신 다른 페이지로 이동할 수 있는 링크(또는 이와 유사한 링크)가 있는 메인 페이지가 있습니다.무료 텍스트를 입력해야 할 경우 데이터를 추가할 텍스트 상자를 제공합니다.버튼을 클릭하면 데이터를 포함하는 Ajax 콜과 같은 것이 생성됩니다.경로에는 무료 텍스트를 제외한 모든 것이 포함됩니다.이렇게 하면...
@RequestMapping(value = "/modules/{moduleBaseName}", method = RequestMethod.GET)
@ResponseBody
public String moduleStrings(@PathVariable String moduleBaseName,
@RequestParam(value = "moduleName", required = false) String moduleName
HttpServletRequest request)
{
return "module name is: " + moduleName;
}
클라이언트 측에서는 ajax 콜의 데이터 속성을 "moduleName" 속성을 포함하는 json으로 설정하기만 하면 됩니다.이런 거.
var params = {};
params.moduleName = userEnteredText;
jQuery.ajax({
type: "GET",
url: 'http://localhost:3000/modules'.json'),
dataType: "json",
data: params,
async: true,
success: function(data) { callback(data); },
error: function() { alert("Error!!!"); }
});
언급URL : https://stackoverflow.com/questions/43470421/pathvariable-in-springboot-with-slashes-in-url
'programing' 카테고리의 다른 글
스프링 부트: 여러 yml 파일 사용 방법 (0) | 2023.02.23 |
---|---|
WordPress REST API를 사용한AJAX 경유 비밀번호 변경 (0) | 2023.02.23 |
갑자기 Springfox Swagger 3.0이 spring webflux에서 작동하지 않음 (0) | 2023.02.23 |
개체 키에 정확히 각도 필터 (0) | 2023.02.18 |
프로토콜 버퍼와 JSON 또는 BSON 비교 (0) | 2023.02.15 |