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种实现方案给大家进行了处理,以后如果你的项目中有这种特殊的需求,现在知道该怎么做了吧?

今日小作业:

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

相关文章
|
2月前
|
Cloud Native Java C++
Springboot3新特性:开发第一个 GraalVM 本机应用程序(完整教程)
文章介绍如何在Spring Boot 3中利用GraalVM将Java应用程序编译成独立的本机二进制文件,从而提高启动速度、减少内存占用,并实现不依赖JVM运行。
237 1
Springboot3新特性:开发第一个 GraalVM 本机应用程序(完整教程)
|
2月前
|
前端开发 Java 数据安全/隐私保护
用户登录前后端开发(一个简单完整的小项目)——SpringBoot与session验证(带前后端源码)全方位全流程超详细教程
文章通过一个简单的SpringBoot项目,详细介绍了前后端如何实现用户登录功能,包括前端登录页面的创建、后端登录逻辑的处理、使用session验证用户身份以及获取已登录用户信息的方法。
237 2
用户登录前后端开发(一个简单完整的小项目)——SpringBoot与session验证(带前后端源码)全方位全流程超详细教程
|
2月前
|
Java API Apache
Springboot+shiro,完整教程,带你学会shiro
这篇文章提供了一个完整的Apache Shiro与Spring Boot结合使用的教程,包括Shiro的配置、使用以及在非Web和Web环境中进行身份验证和授权的示例。
72 2
Springboot+shiro,完整教程,带你学会shiro
|
2月前
|
前端开发 Java Apache
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
本文详细讲解了如何整合Apache Shiro与Spring Boot项目,包括数据库准备、项目配置、实体类、Mapper、Service、Controller的创建和配置,以及Shiro的配置和使用。
375 1
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
|
2月前
|
缓存 NoSQL Java
springboot的缓存和redis缓存,入门级别教程
本文介绍了Spring Boot中的缓存机制,包括使用默认的JVM缓存和集成Redis缓存,以及如何配置和使用缓存来提高应用程序性能。
117 1
springboot的缓存和redis缓存,入门级别教程
|
2月前
|
easyexcel Java UED
SpringBoot中大量数据导出方案:使用EasyExcel并行导出多个excel文件并压缩zip后下载
在SpringBoot环境中,为了优化大量数据的Excel导出体验,可采用异步方式处理。具体做法是将数据拆分后利用`CompletableFuture`与`ThreadPoolTaskExecutor`并行导出,并使用EasyExcel生成多个Excel文件,最终将其压缩成ZIP文件供下载。此方案提升了导出效率,改善了用户体验。代码示例展示了如何实现这一过程,包括多线程处理、模板导出及资源清理等关键步骤。
|
3月前
|
JavaScript Java 关系型数据库
毕设项目&课程设计&毕设项目:基于springboot+vue实现的在线考试系统(含教程&源码&数据库数据)
本文介绍了一个基于Spring Boot和Vue.js实现的在线考试系统。随着在线教育的发展,在线考试系统的重要性日益凸显。该系统不仅能提高教学效率,减轻教师负担,还为学生提供了灵活便捷的考试方式。技术栈包括Spring Boot、Vue.js、Element-UI等,支持多种角色登录,具备考试管理、题库管理、成绩查询等功能。系统采用前后端分离架构,具备高性能和扩展性,未来可进一步优化并引入AI技术提升智能化水平。
毕设项目&课程设计&毕设项目:基于springboot+vue实现的在线考试系统(含教程&源码&数据库数据)
|
1月前
|
JavaScript 前端开发 Java
SpringBoot_web开发-webjars&静态资源映射规则
https://www.91chuli.com/ 举例:jquery前端框架
19 0
|
2月前
|
数据采集 监控 Java
SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......
本文是关于SpringBoot日志的详细教程,涵盖日志的定义、用途、SLF4J框架的使用、日志级别、持久化、文件分割及格式配置等内容。
170 0
SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......
|
2月前
|
存储 JSON 算法
JWT令牌基础教程 全方位带你剖析JWT令牌,在Springboot中使用JWT技术体系,完成拦截器的实现 Interceptor (后附源码)
文章介绍了JWT令牌的基础教程,包括其应用场景、组成部分、生成和校验方法,并在Springboot中使用JWT技术体系完成拦截器的实现。
97 0
JWT令牌基础教程 全方位带你剖析JWT令牌,在Springboot中使用JWT技术体系,完成拦截器的实现 Interceptor (后附源码)