当前位置: 首页 > 知识库问答 >
问题:

带有斜杠的Spring靴路径变量问题

钦海荣
2023-03-14

我对应该在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个答案

仇承志
2023-03-14

使用字符串作为路径变量是一个固有的问题,这不是您的代码的问题,而是如何解释HTTP请求的问题,因此您无法在代码中执行任何操作来使其工作。

不过,你确实有一些选择:

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

我更倾向于使用2,因为为所有可能出现问题的字符/字符串保留1是非常混乱和不必要的。

要正确地完成2,您应该考虑让所有的REST getters只通过一个数字ID来查找它们的相关实体,例如

localhost:8080/find-user/3

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

localhost:8080/查找用户?用户名=/gfdge1/DkxA8P jYw43

 类似资料:
  • 问题内容: 例如,采取以下两条路线。 根据文档,可以理解以下内容: 在第一种情况下,对路线的请求将返回404响应。已验证。 在第二种情况下有效,并将重定向到 我想看到的行为是 “逆” 的 情况下,两个 行为。例如将重定向到而不是其他方式。有没有办法定义采取此行为的途径? 根据我的理解,可以在路由上设置有效地获得第一种情况下第二种情况下的相同行为,但是我想做的是获得重定向行为,以始终将其重定向到UR

  • 我有一个带有几个API RESTendpoint的Java Spring Boot应用程序。

  • 我有一个Spring Boot1.3应用程序,其中server.contextpath=/ts处于开发模式。 在浏览器中,我可以访问http://localhost:8888/ts或http://localhost:8888/ts/ 谢了。

  • 本文向大家介绍Python中的左斜杠、右斜杠(正斜杠和反斜杠),包括了Python中的左斜杠、右斜杠(正斜杠和反斜杠)的使用技巧和注意事项,需要的朋友参考一下 首先,"/"左倾斜是正斜杠,"\"右倾斜是反斜杠,可以记为:除号是正斜杠一般来说对于目录分隔符,Unix和Web用正斜杠/,Windows用反斜杠,但是现在Windows (一)目录中的斜杠们 python读文件需要输入的目录参数,列出以下

  • 问题内容: 这个问题已经在这里有了答案 : Python中的Windows路径 (5个答案) 9个月前关闭。 在Python中将字符串设置为Windows的文件路径时,是否需要将其格式设置为: 还是转义不适用于Windows?目前,我的脚本在该行中给了我类似“非ASCII字符”的信息,因此我无法真正进行测试。 问题答案: 简短的回答: 改用gnibbler的建议使用正斜杠。 关于使用原始字符串:

  • 因此,我成功地设置了一个邮递员模拟服务器,并可以利用简单的GET,这些GET在api url中没有任何路径变量,但所有类似于<code>{{url}}/users/:urserId</code>或类似于<code>{{url}}/users/:userId/ffavorits</code>的GET都以<code>mockRequestNotFoundError</code>响应 只是想找出正确的方