SpringBoot路径变量斜杠问题

时间:2019-08-22 10:24:03

标签: java spring spring-boot path-variables

我对应该在url中发送的变量中的斜杠有一些问题。 例如id可能是这样的:

ID: /gfdge1/DkxA8P+jYw43
URL: localhost:8080/find-user//gfdge1/DkxA8P+jYw43

"error": "Internal Server Error",
    "exception": "org.springframework.security.web.firewall.RequestRejectedException",
    "message": "The request was rejected because the URL was not normalized.",

因为此斜线首先出现问题

在此之前,我在ID中间遇到这些斜杠的问题,但是我已经使用以下代码解决了这个问题:

   @RequestMapping(name = "Get user data by ID", value = "/find-user/{userId}/**", method = RequestMethod.GET)
    @ResponseBody
    public User getUserData(@PathVariable String userId, 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 id="";
        if (null != arguments && !arguments.isEmpty()) {
            id = userId + '/' + arguments;
        } else {
            id = userId;
        }
        return userService.getUserData(id);
    }

,但是当斜杠放在首位时,这不适用于这种情况。 我也尝试使用RequestParam代替PathVariable,但是它存在一些特殊字符的问题,例如当我使用RequestParam时,它用空白替换'+',...

有人可以帮助我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

使用Strings作为路径变量是一个固有的问题,这与代码无关,但与HTTP请求的解释方式无关,因此您无法在代码中进行任何操作来实现此目的。

您确实有一些选择:

  1. 确保您使用的值不能用特殊字符(例如“ /”)创建
  2. 避免在路径变量中完全使用字符串。

我更倾向于2,因为对所有可能的问题字符/字符串保持1相当混乱且不必要。

要正确执行2,您应该考虑让所有REST获取者仅通过数字ID查找其相关实体,例如

  

localhost:8080 / find-user / 3

如果您需要添加其他搜索参数,例如用户名,那么您应该使用QueryDSL之类的东西来创建搜索参数的谓词,这些谓词将作为查询参数而不是路径变量传递,例如:

  

localhost:8080 / find-user?username = / gfdge1 / DkxA8P + jYw43