前言
在前面的章节中,壹哥 带大家对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. 需求说明
假如现在我们创建了一个如下的控制器接口:
"/") (publicclassHelloController { "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*/publicclassDefaultMvcConfigextendsWebMvcConfigurationSupport { protectedvoidconfigurePathMatch(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*/publicclassWelcomeController { /*** produces="application/json;charset=UTF-8":解决继承WebMvcConfigurationSupport类时中文乱码的问题.*/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种实现方案给大家进行了处理,以后如果你的项目中有这种特殊的需求,现在知道该怎么做了吧?
今日小作业:
设计一个学生信息查询接口,处理该接口中的特殊符号。