温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

滥用@PathVariable导致出现bug如何解决

发布时间:2022-12-13 09:19:41 来源:亿速云 阅读:109 作者:iii 栏目:开发技术

这篇“滥用@PathVariable导致出现bug如何解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“滥用@PathVariable导致出现bug如何解决”文章吧。

    前言

    先说结论吧:@PathVariable可以使请求参数动态的绑定到URL上,但是如果请求参数中包含特殊字符,比如 /,就可能导致Spring匹配到一个错误的URL,或者匹配不到合适的URL。

    复现

    下面,我用一个简单的伪代码复现一下这个bug,与大家分析一下这个bug发生的原因,以及如何解决,最后顺便再通过源码加深一下印象。

    如下,我们定义一个接口,并且通过@PathVariable将入参动态的绑定到URL上。

    @RestController
    @RequestMapping(value = "/demo")
    public class DemoController {
        @GetMapping(value = "/getVal/{val}")
        public ResponseEntity<Object> getVal(@PathVariable String val){
            System.out.println("参数:" + val);
            return ResponseEntity.ok(val);
        }
    }

    然后我们测试一下这个接口:

    滥用@PathVariable导致出现bug如何解决

    正常情况下,我们输入一个普通无特殊符号的参数,控制台也成功打印了出来。

    但是业务参数往往是不可控的,比如当参数变成“ hello/world”时,代码就不能正常执行了。

    滥用@PathVariable导致出现bug如何解决

    大家可以从图中看到,Spring将原本预期的URL:/demo/getVal/{val},解析成了/demo/getVal/hello/world。

    而之所以测试同学最近才发现这个接口有问题,也正是因为上线之初并没有遇到带有/的参数,所以接口看起来是正常的,直到最近在生产环境遇到了一个带/的参数。

    正确的做法是:将URL定义为/demo/getVal,然后将参数通过表单或者query的方式传递。

    滥用@PathVariable导致出现bug如何解决

    解决的办法很简单,相信有点经验的同学都能很快将这个问题修复。

    但是知其然,更要知其所以然,顺着这个问题,我们探究一下Spring究竟是如何解析URL的。

    首先,我们找到Spring webmvc的包,在org.springframework.web.servlet.handler包下找到AbstractHandlerMethodMapping类,这个类就是会将我们定义的mapping和URL绑定起来。

    这个类中的lookupHandlerMethod方法,会查找当前请求的最佳匹配处理程序方法,并且如果找到多个匹配项,就选择最佳匹配项。

    滥用@PathVariable导致出现bug如何解决

    分析这个方法,我们可以得到这样3个匹配步骤

    3个匹配步骤

    1,根据Path精准匹配

    滥用@PathVariable导致出现bug如何解决

    2,如果精准匹配没有成功,就开始模糊匹配

    滥用@PathVariable导致出现bug如何解决

    3,如果模糊匹配还匹配不上,就返回null

    滥用@PathVariable导致出现bug如何解决

    滥用@PathVariable导致出现bug如何解决

    以上就是关于“滥用@PathVariable导致出现bug如何解决”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI