这是nacos中的ControllerMethodsCache,作用是通过HttpServletRequest获取controller中处理该request的方法,然后获取Secured注解
既然已经注入到spring容器中了,为什么不用现成的RequestMappingHandlerMapping方法来处理
这是nacos中的ControllerMethodsCache,作用是通过HttpServletRequest获取controller中处理该request的方法,然后获取Secured注解
既然已经注入到spring容器中了,为什么不用现成的RequestMappingHandlerMapping方法来处理
看了一下DistroFilter同理,都是注入容器中的,单独写一个扫包加处理class是不是太繁琐了,如果没有额外功能应该是能通过第二种方式优化掉的
目的是找到url所映射的controller类的方法, 从而找到该方法是否被特殊注解,并且能获取到这个特殊注解。
之前也想过应该要可以直接用Spring 的mapping,但是一直没有时间做, 如果你有空可以做一下优化, 先找一个注解,比如Distro做一个替换测试,没问题之后再全面替换和删除。
这里有几个比较特殊的点:
/xx/xx/
,/xx/xx
,/xx/xx?
,//xx/xx
之类的需要等价,主要是防止绕过鉴权。那完全用RequestMappingHandlerMapping取代ControllerMethodsCache之后,是否要将ControllerMethodsCache该类移除掉呢。我有意来做这个修改工作
我理解如果平替掉的话就可以移除掉了,包括RequestMappingInfo这些类,都是很老版本的东西了,直接复用spring提供的能力更好
在尝试修改成RequestMappingHandlerMapping 获取 Method的时候。 出现了问题。
HandlerExecutionChain executionChain = handlerMapping.getHandler(req); --获取失败
出现了 Expected lookupPath in request attribute "org.springframework.web.util.UrlPathHelper.PATH".报错 源码分析定位
结论:spirngBoot版本太高出现,修改失败。 该问题就是源自springboot 2.6.0后的新特性。 @KomachiSion @985492783
我项目里的解决方案是添加spring.mvc.pathmatch.matching-strategy=ant_path_matcher,但是没有深究这两者的区别,如果要替换还得仔细研究研究会不会有不兼容的地方
如果是在项目里使用配置来处理,那么就应该会影响到全局的配置。 个人觉得要自定义拦截器或特定的RequestMappingHandlerMapping实例来处理特定的请求路径。这样可以更细粒度地控制路径匹配策略的应用范围。
这样实现是否可以 @KomachiSion
没看懂,具体想要怎么做
建议PR中的修改:
第一点:可以修改实现。 第二点:无法评估,这个是springBOot方面的问题。
看是否还要继续修改@KomachiSion
1.如果不设置Any-matcher, 在springBoot版本大于2.6.0. (HttpServletRequest) request 使用 RequestMappingHandlerMapping 获取 method 会有官方的bug出现。 获取不到method 。所有才设置Any-matcher。
我觉得在不明确的情况下, 最好还是不要替换了, 因为即使这个安全隐患存在于spring boot, 但spring boot默认不开启Any-matcher,而nacos开启, 最后就会变成是nacos的安全漏洞,而不是spring boot的。 这点类似于actuator配置路径为*导致的内存dump泄漏等安全问题。
或者等spring boot修复了这个问题,我们升级了对应的修复版本,再进行替换。