SpringBoot2.x系列教程17--SpringBoot中对URL路径规则的特殊匹配实现方案

简介: 前言在前面的章节中,壹哥 带大家对JSON进行了序列化和反序列化的特殊处理,但是我们开发时,不仅仅JSON需要特殊处理,有时候就连我们的URL接口地址中也有需要特殊处理的地方。比如,在一个URL中,“.” 字符一般是作为分隔符来定义格式的,例如/projects/spring-boot.json中的 “点” ,那么如果在URL带有这个 ”.“,我们要不要做特殊的处理呢?另外有的人在访问URL时,可能会在尾部带有一个”/“,如果我们想识别URL路径尾部的斜杠,如“/home/”中的第2个 “/”,该怎么办?这些都是一些比较特殊的需求,那么我们要不要处理呢?接下来 壹哥 就教各位把U

前言

在前面的章节中,壹哥 带大家对JSON进行了序列化和反序列化的特殊处理,但是我们开发时,不仅仅JSON需要特殊处理,有时候就连我们的URL接口地址中也有需要特殊处理的地方。

比如,在一个URL中,“.” 字符一般是作为分隔符来定义格式的,例如/projects/spring-boot.json中的 “点” ,那么如果在URL带有这个 ”.“,我们要不要做特殊的处理呢?

另外有的人在访问URL时,可能会在尾部带有一个”/“,如果我们想识别URL路径尾部的斜杠,如“/home/”中的第2个 “/”,该怎么办?

这些都是一些比较特殊的需求,那么我们要不要处理呢?接下来 壹哥 就教各位把URL中的这种特殊符号给识别处理了。

一. URL路径匹配

1. 概述

在Spring Boot 1.5版本及以前,假如我们定义了一个’/show‘接口,默认情况下,我们可以通过/show来访问资源,也可以通过/show.do这样带有“.do”后缀的接口来访问资源。

但是到了Spring Boot 2.x之后,我们发现再使用.do这样的扩展名就无法访问资源了。

也就是说,现在的Spring Boot在默认情况下,禁用了后缀匹配模式!

但是我们在开发Web应用程序时,并不总是使用一些默认的配置。有时,我们要创建的URL接口中,可能会包含特别的字符 “.”,有时候我们也希望可以识别URL中的斜杠。这些需求,其实SpringBoot都为我们提供了解决方案,以便开发人员可以按需定制。

2. 需求说明

假如现在我们创建了一个如下的控制器接口:

@RestController@RequestMapping("/")
publicclassHelloController {
@RequestMapping("hello")
publicStringshowHello() {
return"Hello,一一哥Sun!";
    }
}

如果是在Spring Boot 1.x版本的控制器中,我们就可以使用下面的接口地址来进行访问资源。

/hello/hello.*

但是如果我们将工程升级到SpringBoot 2.x后,默认情况下我们只能使用/hello这个接口来访问资源,那么怎样才能像SpringBoot 1.x那样来访问呢?

接下来我就带大家在SpringBoot 2.x版本中实现自定义的URL路径匹配,处理URL请求中的特殊符号。

3. 自定义URL路径匹配规则实现方式

对上面提到的需求,这里我给大家提供了2种实现方案:

  • 1. 以代码配置实现方式;
  • 2. 以配置文件实现方式。

三. 以代码配置方式实现

1. 创建一个web项目(略)

首先我们还是创建一个新的项目模块,具体过程略,各位请参考之前的内容创建即可。

2. 实现方式

在以代码配置的实现方案里,我们又可以有2种具体的实现方式来实现:

  • 继承WebMvcConfigurerAdapter抽象类,重写configurePathMatch方法;
  • 继承WebMvcConfigurationSupport类,重写configurePathMatch方法。

上述两种方式的核心都是:

configurePathMatch(PathMatchConfigurerconfigurer)函数,让开发人员可以根据需求定制URL路径的匹配规则。setUseSuffixPatternMatch(booleanuseSuffixPatternMatch)
设置是否是后缀模式匹配,true即匹配。

核心开发步骤就是两步:

(1). 继承WebMvcConfigurationSupport;

(2). 重写configurePathMatch方法。

3. 具体实现过程

接下来我就把以WebMvcConfigurationSupport实现的方式给大家具体的展示出来。

3.1 创建WebMvcConfigurationSupport配置类

首先我们编写一个Config配置类,继承WebMvcConfigurationSupport,复写configurePathMatch()方法。

packagecom.yyg.boot.config;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.core.Ordered;
importorg.springframework.web.servlet.config.annotation.PathMatchConfigurer;
importorg.springframework.web.servlet.config.annotation.ViewControllerRegistry;
importorg.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
importorg.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
/*** @Description Description* @Author 一一哥Sun* @Date Created in 2020/3/21*/@ConfigurationpublicclassDefaultMvcConfigextendsWebMvcConfigurationSupport {
@OverrideprotectedvoidconfigurePathMatch(PathMatchConfigurerconfigurer) {
//setUseSuffixPatternMatch:设置是否遵循后缀匹配模式,如“/user”是否匹配/user.*,为true时就匹配;configurer.setUseSuffixPatternMatch(true)
//setUseTrailingSlashMatch,设置是否自动后缀留级匹配模式,如“/user”是否匹配“/user/”,为true是即匹配                .setUseTrailingSlashMatch(true);
    }
}

3.2 创建Controller接口

接着我们创建一个Controller接口,编写一个”/show“接口。

packagecom.yyg.boot.web;
importorg.springframework.stereotype.Controller;
importorg.springframework.web.bind.annotation.GetMapping;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.ResponseBody;
/*** @Description URL路径访问规则+内容协商管理* @Author 一一哥Sun* @Date Created in 2020/3/21*/@ControllerpublicclassWelcomeController {
/*** produces="application/json;charset=UTF-8":解决继承WebMvcConfigurationSupport类时中文乱码的问题.*/@ResponseBody@GetMapping(value="/show",produces="application/json;charset=UTF-8")
publicStringshowMsg() {
return"听一一哥讲解URL路径访问规则...";
    }
}

3.3 启动测试

启动项目后进行测试,在浏览器中输入地址:
http://localhost:8080/show.do

此时我们可以看到,即使我们带有".do"后缀,也可以访问对应的资源页面,但是在此之前是不可以的。

另外如果我们在浏览器中输入地址:
http://localhost:8080/show/

此时可以看到,即使我们带有"/show/"后缀,也可以访问页面。

4. 小结

抽象类WebMvcConfigurerAdapter与WebMvcConfigurationSupport都可以实现URL路径特殊符号的处理, WebMvcConfigurerAdapter中具有的功能,在WebMvcConfigurationSupport中也有,现在一般都建议使用WebMvcConfigurationSupport类。

四. 以配置文件方案实现

上面通过代码配置类的实现方案,其实是有点复杂的。在SpringBoot中,我们也可以在properties或yml配置文件中实现相同的效果,这种方式就会比较简单。

我们先把前面案例中配置类中的@Configuration注解先注释掉,使得之前的配置代码失效,接下来再创建一个application.properties配置文件。

1. 创建application.properties文件

#设置是否遵循后缀匹配模式,如“/user”是否匹配/user.* ,为true时就匹配;spring.mvc.pathmatch.use-suffix-pattern=true#设置是否自动匹配后缀模式,如“/user”是否匹配“/user/”,为true是即匹配spring.mvc.pathmatch.use-registered-suffix-pattern=false

2. 重启项目测试

接下来就直接重启项目,在浏览器中输入地址:
http://localhost:8080/show.dooo

2.1 测试/show.*模式

可以看到,此时即使我们带有".dooo"后缀,也可以访问页面。

2.2 测试/show/模式

在浏览器中输入地址:
http://localhost:8080/show/

可以看到,此时即使我们带有"/show/"后缀,也可以访问页面。

结语

至此,我就把URL中带有的特殊符号,通过2种实现方案给大家进行了处理,以后如果你的项目中有这种特殊的需求,现在知道该怎么做了吧?

今日小作业:

设计一个学生信息查询接口,处理该接口中的特殊符号。

相关文章
|
3月前
|
JavaScript 前端开发 Java
SpringBoot之静态资源规则与定制化
SpringBoot之静态资源规则与定制化
|
4月前
|
XML Java 数据格式
SpringBoot中yaml格式、语法规则及数据读取方式(3种)
SpringBoot中yaml格式、语法规则及数据读取方式(3种)
205 0
|
1月前
|
Java 数据库
【问题记录(已解决)】springboot整合ssm报错‘url‘ attribute is not specified and no embedded datasource
【问题记录(已解决)】springboot整合ssm报错‘url‘ attribute is not specified and no embedded datasource
|
5月前
|
Java 测试技术 数据安全/隐私保护
Spring Boot | 一种优雅的参数校验方案(个人总结)
一种优雅的参数校验方案(个人总结)
299 1
Spring Boot | 一种优雅的参数校验方案(个人总结)
|
2月前
|
Java Maven
【SpringBoot专题_02】springboot集成Swagger详细教程
【SpringBoot专题_02】springboot集成Swagger详细教程
|
2月前
|
XML 监控 druid
【Java专题_02】springboot+mybatis+pagehelper分页插件+druid数据源详细教程
【Java专题_02】springboot+mybatis+pagehelper分页插件+druid数据源详细教程
|
2月前
|
开发框架 安全 Java
【Java专题_01】springboot+Shiro+Jwt整合方案
【Java专题_01】springboot+Shiro+Jwt整合方案
|
2月前
|
存储 算法 Java
Spring Boot 通用限流方案
Spring Boot 通用限流方案
103 0
|
3月前
|
Java Docker Windows
Windows下部署SpringBoot的实践方案(Docker & Docker Desktop)
Windows下部署SpringBoot的实践方案(Docker & Docker Desktop)
74 0
|
3月前
|
前端开发 Java 测试技术
SpringBoot - 应用程序测试方案
SpringBoot - 应用程序测试方案
54 0