在 SpringBoot 中使用 URL 中的斜杠@PathVariable

2022-09-02 02:41:34

我必须在SpringBoot应用程序中使用@PathValiable从URL中获取参数。这些参数通常具有斜杠。我无法控制用户在URL中输入的内容,因此我想获得他输入的内容,然后我可以处理它。

我已经在这里查看了材料和答案,我不认为对我来说,好的解决方案是要求用户以某种方式编码输入参数。

SpringBoot代码很简单:

@RequestMapping("/modules/{moduleName}")
@ResponseBody
public String moduleStrings (@PathVariable("moduleName") String moduleName) throws Exception {

  ...

}

因此,例如,URL将如下所示:

http://localhost:3000/modules/...

问题是参数模块名称通常有斜杠。例如

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

这是否可以获取用户在 /modules/ 之后在 URL 中输入的所有内容?

如果有人告诉我处理此类问题的好方法是什么。


答案 1

根据P.J.Meisch的回答,我为我的案件找到了简单的解决方案。此外,它还允许在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;

}

答案 2

此代码获取完整路径:

@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;
}