SpringBoot 前缀匹配规则配置:
spring: mvc: pathmatch: use-suffix-pattern: true use-registered-suffix-pattern: true
目前基本所有的官方商城项目都是使用的spring mvc 框架,使用@RequestMapping来定义具体的url,例如:
示例1
1 2 3 4 5 6 7 8 |
|
以Gucci商城举例,购物车链接是 https://www.gucci.cn/zh/shoppingcart 但是如果把url改为 https://www.gucci.cn/zh/shoppingcart.htm 也是可以访问的,
甚至是 .abcdefg 后缀都可以访问的。正常来说我们在代码当中只是配置了 "/shoppingcart",那么访问"/shoppingcart.htm" 应该直接到404页面的,而不是
到正常的购物车页面。而造成这种现象的具体原因如下:
RequestMappingInfoHandlerMapping 在处理http请求的时候, 如果请求url 有后缀,如果找不到精确匹配的那个@RequestMapping方法。
那么,就把后缀去掉,然后.* 去匹配,这样,一般都可以匹配。 比如有一个@RequestMapping("/shoppingcart"), 那么精确匹配的情况下, 只
会匹配/shoppingcart请求。 但如果我前端发来一个 /shoppingcart.abcdef 这样的请求, 又没有配置 @RequestMapping("/shoppingcartabcdef")
这样映射的情况下, 那么@RequestMapping("/shoppingcart") 就会生效。
处理链是这样的:
at org.springframework.web.servlet.mvc.condition.PatternsRequestCondition.getMatchingPattern(PatternsRequestCondition.java:254)
at org.springframework.web.servlet.mvc.condition.PatternsRequestCondition.getMatchingPatterns(PatternsRequestCondition.java:230)
at org.springframework.web.servlet.mvc.condition.PatternsRequestCondition.getMatchingCondition(PatternsRequestCondition.java:210)
at org.springframework.web.servlet.mvc.method.RequestMappingInfo.getMatchingCondition(RequestMappingInfo.java:214)
at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getMatchingMapping(RequestMappingInfoHandlerMapping.java:79)
at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getMatchingMapping(RequestMappingInfoHandlerMapping.java:56)
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.addMatchingMappings(AbstractHandlerMethodMapping.java:358)
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:328)
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:299)
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:57)
at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:299)
at org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1104)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:916)
具体来说是AbstractHandlerMethodMapping的getHandlerInternal方法
示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
|
如果想要精确匹配的话,需要在spring mvc的配置文件中设置,以5.3.2.X 以上版本来说需要在 springmvc-annotation-driven.xml配置文件当中添加如下代码,将后缀模式设置为false
|
同时其他的一些规则,比如忽略url大小写,可以自定义规则,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|