Spring5路径匹配器PathPattern解析

目录
  • Spring5路径匹配器PathPattern
    • 1.PathPattern 只支持结尾部分使用 **
    • 2.PathPattern 支持使用例如 {*path}
  • 路径匹配工具(AntPathMatcher vs PathPattern)

Spring5路径匹配器PathPattern

PathPattern 对url地址匹配的处理更加快速,它和AntPathMatcher 主要差异如下:

1.PathPattern 只支持结尾部分使用 **

如果在路径的中间使用 ** 就会报错;

@GetMapping("/funyi/**")
public String act1() {
    return "/funyi/**";
}

2.PathPattern 支持使用例如 {*path}

的方式匹配请求路径,同时可以匹配到多级路径,并将获取的值赋给 对应controller方法的形参path;

@GetMapping("/funyi/{*path}")
public void act2(@PathVariable String path) {
    System.out.println("path = " + path);
}

SpringBoot 项目添加如下配置即可开启PathPattern:

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        configurer.setPatternParser(new PathPatternParser());
    }
}

路径匹配工具(AntPathMatcher vs PathPattern)

  • AntPathMatcher:Sping第一个版本(2013念)引入。
  • PathPattern:Spring 5 引入,所在包:org.springframework.web.util.pattern.PathPattern,所属模块为spring-web。可见它专为Web设计的“工具”。

PathPattern去掉了Ant字样,但保持了很好的向下兼容性:除了不支持将**写在path中间之外(以消除歧义),其它的匹配规则从行为上均保持和AntPathMatcher一致,并且还新增了强大的{*pathVariable} 的支持。整体上可认为后者兼容了前者的功能。

  • PathPattern性能比AntPathMatcher好。理论上pattern越复杂,PathPattern的优势越明显;
  • AntPathMatcher可用于非Web环境,而PathPattern只适用于Web环境。所以PathPattern也不是能完全替代AntPathMatcher的。

内部实现原理上看,AntPathMatcher进行的是纯字符串操作和比对;而PathPattern则对于任何一个字符串的pattern最终都会被解析为若干段的PathElement,这些PathElement以链式结构连接起来用以表示该pattern,形成一个对象数据,这种结构化的表示使得可读性更强、更具灵活性,从而获得更好的性能表现。

两者简单使用示例:

new AntPathMatcher().match("/api/v1/**", "/api/v1/2/3**");
new PathPatternParser().parse("/api/v1/**").matches(PathContainer.parsePath("/api/v1/2/3**"));
//每一个pathPattern串对应一个PathPatternParser、每一个parsedPath串对应一个PathContainer

可能有小伙伴会说:在Service层,甚至Dao层我也可以正常使用PathPattern对象呀,何解?

这个问题就相当于:HttpServletRequest属于web层专用组件,但你依旧可以将其传到Service层,甚至Dao层供以使用,在编译、运行时不会报错。但你可深入思考下,这么做合适吗?

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • spring mvc路径匹配原则详解

    在Spring MVC中经常要用到拦截器,在配置需要要拦截的路径时经常用到<mvc:mapping/>子标签,其有一个path属性,它就是用来指定需要拦截的路径的.例如: <mvc:interceptor> <mvc:mapping path="/**" /> <bean class="com.i360r.platform.webapp.runtime.view.interceptor.GenericInterceptor"

  • 详解SpringMVC的url-pattern配置及原理剖析

    xml里面配置标签: <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> &

  • 基于Spring概念模型:PathMatcher 路径匹配器

    目录 概述 PathMatcher接口源代码 AntPathMatcher使用例子 spring的路径匹配工具 AntPathMatcher 以下代码为本人使用过的路径匹配工具代码 核心代码是这一行 源代码版本 : spring-webmvc-5.1.4.RELEASE 概述 PathMatcher是Spring的一个概念模型接口,该接口抽象建模了概念"路径匹配器",一个"路径匹配器"是一个用于路径匹配的工具.它的使用者是 : org.springframework

  • Spring源码之请求路径匹配路由方式

    目录 请求路径匹配路由 入口 进入上面方法 SpringMVC 将请求找到匹配的处理 初始化映射关系 从映射关系中寻找匹配方法 请求路径匹配路由 在spring中,当一个请求过来的时候会做路径匹配,下面我们就从源码层面分析一下路径匹配. 示例: @RequestMapping(value = "/user/{aid}/online/**", method = RequestMethod.GET) 我们一起看看这个方法是如何寻找的,和一些相应的工具类 入口 我的项目使用的是自动配置的Re

  • SpringCloud实战小贴士之Zuul的路径匹配

    不论是使用传统路由的配置方式还是服务路由的配置方式,我们都需要为每个路由规则定义匹配表达式,也就是上面所说的 path 参数.在Zuul中,路由匹配的路径表达式采用了Ant风格定义. Ant风格的路径表达式使用起来非常简单,它一共有下面这三种通配符: 通配符 说明 ? 匹配任意的单个字符 * 匹配任意数量的字符 ** 匹配任意数量的字符,支持多级目录 我们可以通过下表的示例来进一步理解这三个通配符的含义并参考着来使用: URL路径 说明 /user-service/? 它可以匹配 /user-s

  • Spring5路径匹配器PathPattern解析

    目录 Spring5路径匹配器PathPattern 1.PathPattern 只支持结尾部分使用 ** 2.PathPattern 支持使用例如 {*path} 路径匹配工具(AntPathMatcher vs PathPattern) Spring5路径匹配器PathPattern PathPattern 对url地址匹配的处理更加快速,它和AntPathMatcher 主要差异如下: 1.PathPattern 只支持结尾部分使用 ** 如果在路径的中间使用 ** 就会报错: @GetM

  • JUnit4 Hamcrest匹配器常用方法总结

    一.Hamcrest是什么? Hamcrest is a library of matchers, which can be combined in to create flexible expressions of intent in tests. Hamcrest 是一个为了测试为目的,且能组合成灵活表达式的匹配器类库. 二.Hamcrest jar包 hamcrest-core.jar -- This is the core API to be used by third-party fr

  • python 中open文件路径的选择问题解析

    一.问题描述 python 中使用open打开某个文件写入时,往往会发现需要写入的文件不在同级目录下.这样就需要根据文件的路径来找到并打开. 但往往有时绝对路径和相对路径,写入不正确就会打开失败. 二.解决方法 1.使用绝对路径 错误方法: 修改后的: 如果代表的是windows文件路径,则使用斜杆/和反斜杠\是一样的:如果代表的是网络文件路径,则必须使用 斜杆/ . 但是我不是很喜欢使用绝对路径,推荐使用相对路径. 2.使用相对路径 错误方法: 修改后的: 因为是处于非同级目录,所以需要在文件

  • ASP.NET Core MVC 修改视图的默认路径及其实现原理解析

    本章将和大家分享如何在ASP.NET Core MVC中修改视图的默认路径,以及它的实现原理. 导语:在日常工作过程中你可能会遇到这样的一种需求,就是在访问同一个页面时PC端和移动端显示的内容和风格是不一样(类似两个不一样的主题),但是它们的后端代码又是差不多的,此时我们就希望能够使用同一套后端代码,然后由系统自动去判断到底是PC端访问还是移动端访问,如果是移动端访问就优先匹配移动端的视图,在没有匹配到的情况下才去匹配PC端的视图. 下面我们就来看下这个功能要如何实现,Demo的目录结构如下所示

  • Python Django路径配置实现过程解析

    假设访问的views.py如下 1.使用url配置默认页 from django.conf.urls import url from django.contrib import admin from django.urls import path from HelloWorld import views urlpatterns = [ path('admin/', admin.site.urls), url('^$', views.hello), ] 这样可以访问http://127.0.0.1

  • 解决Spring Security的权限配置不生效问题

    目录 SpringSecurity权限配置不生效 1.不生效的例子 2.解决办法 SpringSecurity动态配置权限 导入依赖 相关配置 创建UserMapper类&&UserMapper.xml 创建UserServiceMenuService 创建CustomFilterInvocationSecurityMetadataSource 创建CustomAccessDecisionManager 创建WebSecurityConfig配置类 Spring Security权限配置不

  • Java利用过滤器实现完善登录功能

    目录 1.问题引入 2.解决思路 3.代码实现 3.1 定义登录校验过滤器 3.2 开启组件扫描 1.问题引入 我们已经完成了后台系统的登录功能开发,但是目前还存在一个问题,就是用户如果不登录,直接访问系统首页面,照样可以正常访问. 很明显,上面这种情况并不合理,我们希望看到的效果应该是,只有登录成功后才可以访问系统中的页面,如果没有登录, 访问系统中的任何界面都直接跳转到登录页面. 2.解决思路 使用 过滤器或者拦截器来实现,在过滤器.拦截器中拦截前端发起的请求,判断用户是否已经完成登录,如果

  • SpringBoot Session接口验证实现流程详解

    目录 添加pom.xml 创建简单的测试接口 使用过滤器实现 使用拦截器实现 需求:只有用户登录成功后,才能访问其它接口,否则提示需要进行登录 项目仓库地址:https://gitee.com/aiw-nine/springboot_session_verify 添加pom.xml 新建Spring Boot(2.7.2)项目,添加如下依赖: <?xml version="1.0" encoding="UTF-8"?> <project xmlns

  • Spring Boot 整合 Shiro+Thymeleaf过程解析

    这篇文章主要介绍了Spring Boot 整合 Shiro+Thymeleaf过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.导包 <!-- springboot 与 shiro 的集成--> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <

随机推荐