file_get_contents请求失败处理_Spring5.2.3在处理无请求mapping上的变化

最近项目升级了Spring的版本,遇到了个小坑,发现过去有一些运行正常的请求在升级Spring后变成404

先上结论,结论很简单,在Spring-webmvc-4.3.16及5.1.6中,可以用如下形式处理所有其他controller不匹配的GET请求

b2df273e330b2cc97785e0205d7bac1f.png

但在5.2.3中,不再支持,必须要写上@RequestMapping("/**")才可以成功匹配

下面是对spring匹配请求的源码分析

Spring中使用RequestMappingHandlerMapping处理请求的匹配逻辑,相关实际逻辑在父类AbstractHandlerMethodMapping中的,代码如下

2074d507a32df6db16442568615c85e2.png

当直接匹配失败后,会进入第一个红色框内模糊匹配逻辑,调用堆栈如下

AbstractHandlerMethodMapping.addMatchingMappings ->

RequestMappingInfoHandlerMapping.getMatchingMapping ->

RequestMappingInfo.getMatchingCondition

0e0791a9d339d0408882f4dec0378a67.png
f4dcb29b52335d80785476a05a0f757a.png

不用版本之间处理逻辑基本相同,这里注意当patterns(当前遍历到的项目中controller的url)为空集合时是认为匹配成功,而会继续往下执行的。

这里发现不同点在于patterns的初始化逻辑,下面是PatternsRequestCondition的初始化逻辑

9b935b03a964f81091255818145f210f.png

下面是spring-web-mvc-4.3.16中对patterns的初始化逻辑,可以看到当传入的patterns为空集合时,返回的也会是空集合,上面提到空的集合是会被默认当做匹配所有请求

816c2e704315b37540c6800c8fef6bdb.png

下面是spring-web-mvc-5.1.6中对patterns的初始化逻辑,逻辑有稍微的调整,但同样传入空集合返回的也是空集合

353172b027efbe6873201324e98baca2.png

而在spring-web-mvc-5.2.3中可以看到当传入集合为空,将返回一个有一个元素""的集合,将会导致在模糊匹配时不会跳过而是进入匹配规则逻辑,故匹配默认controller失败

3a404094053eb0bbe9afe526f9cd5e3f.png

另外匹配结束后,在上面AbstractHandlerMethodMapping的第二个红框内还会做二次校验,当patterns不为空集合时会进行参数提取,由于url不匹配也将会导致报错

ba5165bf967246ad774c8c311ac91e56.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值