springMVC是如何做url映射到controller的?

背景

最近要做一个URL到权限的控制,需要根据实际的URL匹配到配置文件,一般的url好处理,但是对于path parameter 的URL就需要做匹配了,所以研读了一下springmvc的源码,看看是如何做的

  • 入口 FrameworkServlet

    • .doPost(HttpServletRequest request, HttpServletResponse response)
  • DispatcherServlet

    • .doService
    • DispatcherServlet.doDispatch
    • HandlerExecutionChain mappedHandler =getHandler(processedRequest)
      这里有多个handlerMapping,实际用到的是RequestMappingHandlerMapping

      this.handlerMappings ={ArrayList@14007} size =7
      0={WebMvcEndpointHandlerMapping@13963}
      1={ControllerEndpointHandlerMapping@14199}
      2={RequestMappingHandlerMapping@9698}
      3={BeanNameUrlHandlerMapping@14200}
      4= {RouterFunctionMapping@14201}
      5={SimpleUrlHandlerMapping@14202}
      6={WelcomePageHandlerMapping@14203}

  • AbstractHandlerMethodMapping
    从这个mapping 中获取RequestMappingHandlerMapping

    • HandlerMethod lookupHandlerMethod(String lookupPath, HttpServletRequest request)

      复制代码
      protected HandlerMethod lookupHandlerMethod(String lookupPath, HttpServletRequest request) throws Exception {
      	List<Match> matches = new ArrayList<>();
      	List<T> directPathMatches = this.mappingRegistry.getMappingsByUrl(lookupPath);
      	if (directPathMatches != null) {
      		addMatchingMappings(directPathMatches, matches, request);
      	}
      	if (matches.isEmpty()) {
      		// No choice but to go through all mappings...
      		addMatchingMappings(this.mappingRegistry.getMappings().keySet(), matches, request);
      	}

这段代码有意思,先去根据url 去map中找RequestMappingInfo (封装了URL匹配相关信息) ,然后去做URL匹配

    • MappingRegistry 保存了所有的配置

      mappingLookup 保存了RequestMappingInfo 和 HandlerMethod 的映射
      MultiValueMap<String, T> urlLookup 保存了路径和方法的映射

  • 所有的配置信息封装在 RequestMappingInfo

    复制代码
      public RequestMappingInfo getMatchingCondition(HttpServletRequest request) {
      	RequestMethodsRequestCondition methods = this.methodsCondition.getMatchingCondition(request);
      	if (methods == null) {
      		return null;
      	}
      	ParamsRequestCondition params = this.paramsCondition.getMatchingCondition(request);
      	if (params == null) {
      		return null;
      	}
      	HeadersRequestCondition headers = this.headersCondition.getMatchingCondition(request);
      	if (headers == null) {
      		return null;
      	}
      	ConsumesRequestCondition consumes = this.consumesCondition.getMatchingCondition(request);
      	if (consumes == null) {
      		return null;
      	}
      	ProducesRequestCondition produces = this.producesCondition.getMatchingCondition(request);
      	if (produces == null) {
      		return null;
      	}
      	PatternsRequestCondition patterns = this.patternsCondition.getMatchingCondition(request);
      	if (patterns == null) {
      		return null;
      	}
      	RequestConditionHolder custom = this.customConditionHolder.getMatchingCondition(request);
      	if (custom == null) {
      		return null;
      	}
    
      	return new RequestMappingInfo(this.name, patterns,
      			methods, params, headers, consumes, produces, custom.getCondition());
      }

找到PatternsRequestCondition ,用来做和url做模式匹配

  • PatternsRequestCondition

    this.pathMatcher = pathMatcher != null ? pathMatcher : new AntPathMatcher();

    this.pathMatcher.match("/Task/GetTaskById/{taskid}", "/Task/GetTaskById/123")

这里实际上是spring 的AntPathMatcher 类,直接调用即可匹配带参数的URL

总结

springMVC 做URL匹配,实际上分两步,1,用url去map中找List directPathMatches

2, 遍历List directPathMatches,逐个做pathMatcher

相关推荐
jinanwuhuaguo1 小时前
(第三十三篇)五月的文明奠基:OpenClaw 2026.5.2版本的文明级解读
android·java·开发语言·人工智能·github·拓扑学·openclaw
xmjd msup2 小时前
spring security 超详细使用教程(接入springboot、前后端分离)
java·spring boot·spring
952362 小时前
SpringBoot统一功能处理
java·spring boot·后端
Lyyaoo.2 小时前
优惠券秒杀业务分析
java·开发语言
消失的旧时光-19432 小时前
统一并发模型:线程、Reactor、协程本质是一件事(从线程到协程 · 第6篇·终章)
java·python·算法
勿忘初心12213 小时前
Java 国密 SM4 加密工具类实战(Hutool + BouncyCastle)|企业级数据加密 + 兼容 JDK8
java·数据安全·数据加密·后端开发·企业级开发·国密 sm4
庞轩px3 小时前
第8篇:原子类与CAS底层原理——无锁并发的实现
java·cas·乐观锁·aba·无锁编程·自旋
rleS IONS3 小时前
SpringBoot中自定义Starter
java·spring boot·后端
苍煜3 小时前
慢SQL优化实战教学
java·数据库·sql
AI进化营-智能译站3 小时前
ROS2 C++开发系列16-智能指针管理传感器句柄|告别ROS2节点内存泄漏与野指针
java·c++·算法·ai