Spring Boot 定制URL匹配规则:终极篇【从零开始学Spring Boot】
需求缘起:
在之前有一篇博客中《Spring Boot 定制URL匹配规则》在网易云课堂(传送门)中有人提问:url订制之后继承 WebMvcConfigurationSupport 重新configurePathMatch,但是静态资源均无法访问404。还真是有这个问题,本篇博客就是为了解决这个问题。
我们先回顾下文章:《Spring Boot 定制URL匹配规则》。
一、回顾《Spring Boot 定制URL匹配规则》
1.1 需求缘起
事情的起源:有人说,说编写了一个/hello访问路径,但是吧,不管是输入/hello还是/hello.html,还是/hello.xxx都能进行访问。当时我还以为他对代码进行处理了,后来发现不是,后来发现这是Spring Boot路由规则。好了,有废话了下,那么看看我们解决上面这个导致的问题。
构建web应用程序时,并不是所有的URL请求都遵循默认的规则。有时,我们希望RESTful URL匹配的时候包含定界符“.”,这种情况在Spring中可以称之为“定界符定义的格式”;有时,我们希望识别斜杠的存在。Spring提供了接口供开发人员按照需求定制。
1.2 解决步骤
核心的开发步骤就是两步(这是之前的解决方案):
(1)启动类 extends WebMvcConfigurationSupport
(2)重写configurePathMatch方法
具体实现代码:
- package com.kfit;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
- import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
- /**
- *
- * @author Angel --守护天使
- * @version v.0.1
- * @date 2016年7月29日下午7:06:11
- */
- @SpringBootApplication
- public class ApiCoreApp extends WebMvcConfigurationSupport{
- /**
- * 1、 extends WebMvcConfigurationSupport
- * 2、重写下面方法;
- * setUseSuffixPatternMatch : 设置是否是后缀模式匹配,如“/user”是否匹配/user.*,默认真即匹配;
- * setUseTrailingSlashMatch : 设置是否自动后缀路径模式匹配,如“/user”是否匹配“/user/”,默认真即匹配;
- */
- @Override
- public void configurePathMatch(PathMatchConfigurer configurer) {
- configurer.setUseSuffixPatternMatch(false)
- .setUseTrailingSlashMatch(true);
- }
- public static void main(String[] args) {
- SpringApplication.run(ApiCoreApp.class, args);
- }
- }
其中访问代码:
- @RequestMapping("/user")
- public String hello(){
- return "/user";
- }
1.3 代码分析
以上代码有两句核心的代码:
第一句代码:setUseSuffixPatternMatch(boolean useSuffixPatternMatch):
设置是否是后缀模式匹配,如“/user”是否匹配/user.*,默认真即匹配;
(1)当此参数设置为true的时候,那么/user.html,/user.aa,/user.*都能是正常访问的。
(2)当此参数设置为false的时候,那么只能访问/user或者/user/( 这个前提是setUseTrailingSlashMatch 设置为true了)。
第二句代码:setUseTrailingSlashMatch (boolean useSuffixPatternMatch):
设置是否自动后缀路径模式匹配,如“/user”是否匹配“/user/”,默认真即匹配;
(1)当此参数设置为true后,那么地址/user,/user/都能正常访问。
(2)当此参数设置为false的时候,那么就只能访问/user了。
1.4 总结
(1)当以上两个参数都设置为true的时候,那么路径/user或者/user.aa,/user.*,/user/都是能正常访问的,但是类似/user.html/ 是无法访问的。
(2)当都设置为false的时候,那么就只能访问/user路径了。
二、定制URL匹配规则终极篇
2.1 新问题的产生
以为上面的解决了问题,但是没想到出现了新的问题:url订制之后继承 WebMvcConfigurationSupport 重新configurePathMatch,但是静态资源均无法访问404,这是为什么呢?
2.2 问题原因
首先我们要知道:Spring Boot 默认为我们提供了静态资源处理,使用 WebMvcAutoConfiguration 中的配置各种属性。
其次我们要知道:如果想要自己完全控制WebMVC,就需要在@Configuration注解的配置类上增加@EnableWebMvc(@SpringBootApplication 注解的程序入口类已经包含@Configuration),增加该注解以后WebMvcAutoConfiguration中配置就不会生效,你需要自己来配置需要的每一项。
最后要知道:@EnableWebMvc=WebMvcConfigurationSupport,使用了@EnableWebMvc注解等于扩展了WebMvcConfigurationSupport但是没有重写任何方法。
总结:继承了WebMvcConfigurationSupport之后spring boot就使用了我们自己定义的Web MVC规则了,这导致没有建立了静态资源的映射路径,也就导致了静态资源的无法访问。
2.3 问题解决
解决思路很简单,只需要替换一个继承类即可,看如下代码:
原先的为:
- @SpringBootApplication
- public class App extends WebMvcConfigurationSupport
替换为:
- @SpringBootApplication
- public class App extends WebMvcConfigurerAdapter
其它的不需要动,就可正常访问到静态资源了。这是什么道理呢?
2.4 分析
我们先看一下几种使用方式:
(1)@EnableWebMvc+extends WebMvcConfigurationAdapter
在扩展的类中重写父类的方法即可,这种方式会屏蔽Spring Boot的@EnableAutoConfiguration中的设置。
(2)extends WebMvcConfigurationSupport
在扩展的类中重写父类的方法即可,这种方式会屏蔽Spring Boot的@EnableAutoConfiguration中的设置。
(3)extends WebMvcConfigurationAdapter
在扩展的类中重写父类的方法即可,这种方式依旧使用Spring Boot的@EnableAutoConfiguration中的设置
@EnableWebMvc注解的作用: 就是把WebMvcConfigurationSupport中的配置加载过来,你继承WebMvcConfigurerAdapter时自定义的一些配置会覆盖WebMvcConfigurationSupport 里的默认配置。
2.4 总结
我们上面代码使用的是(3)extends WebMvcConfigurationAdapter:这种方式依旧使用了spring boot的@EnableAutoConfiguration的设置,也就是@EnableWebMvc的配置也是生效的,那么WebMvcConfigurationSupport中的配置就会被加载进来,而我们继承的WebMvcConfigurerAdapter覆盖的方法又会覆盖WebMvcConfigurationSupport里的默认配置。好了,本篇文章就到这里,希望你能有所收获。
Spring Boot 定制URL匹配规则:终极篇【从零开始学Spring Boot】相关推荐
- (38)Spring Boot分布式Session状态保存Redis【从零开始学Spring Boot】
[本文章是否对你有用以及是否有好的建议,请留言] 在使用spring boot做负载均衡的时候,多个app之间的session要保持一致,这样负载到不同的app时候,在一个app登录之后,而访问到另外 ...
- 23. Spring Boot启动加载数据CommandLineRunner【从零开始学Spring Boot】
2019独角兽企业重金招聘Python工程师标准>>> 102. Spring Boot之CommandLineRunner和ApplicationRunner[从零开始学Sprin ...
- 78. Spring Boot完美使用FastJson解析JSON数据【从零开始学Spring Boot】
[原创文章,转载请注明出处] 个人使用比较习惯的json框架是fastjson,所以spring boot默认的json使用起来就很陌生了,所以很自然我就想我能不能使用fastjson进行json解析 ...
- springboot日志写入mysql_44. Spring Boot日志记录SLF4J【从零开始学Spring Boot】
学院中有Spring Boot相关的课程!点击「阅读原文」进行查看! SpringSecurity5.0视频:http://t.cn/A6ZadMBe Sharding-JDBC分库分表实战: 在开发 ...
- 14. Spring Boot定时任务的使用【从零开始学Spring Boot】
[视频 & 交流平台] à SpringBoot视频 http://study.163.com/course/introduction.htm?courseId=1004329008& ...
- (30)导入时如何定制spring-boot依赖项的版本【转载】【从零开始学Spring Boot】...
此文章转载地址:http://www.tuicool.com/articles/RJJvMj3 请注重作者的版权. spring-boot通过maven的依赖管理为我们写好了很多依赖项及其版本,我们可 ...
- 54. spring boot日志升级篇—logback【从零开始学Spring Boot】
在<44. Spring Boot日志记录SLF4J>章节中有关相关的介绍,这里我们在深入的了解下logback框架. 为什么要使用logback ? --在开发中不建议使用System. ...
- (10)Spring Boot修改端口号【从零开始学Spring Boot】
Spring boot 默认端口是8080,如果想要进行更改的话,只需要修改applicatoin.properties文件,在配置文件中加入: server.port=9090 常用配置: #### ...
- 70.打印所有Spring boot载入的bean【从零开始学Spring Boot】
[从零开始学习Spirng Boot-常见异常汇总] 问题的提出: 我们在开发过程当中,我们可能会碰到这样的问题:No qualifying bean 就是我们定义的bean无法进行注入,那到底是什 ...
- (13)处理静态资源(自定义资源映射)【从零开始学Spring Boot】
上面我们介绍了Spring Boot 的默认资源映射,一般够用了,那我们如何自定义目录? 这些资源都是打包在jar包中的,然后实际应用中,我们还有很多资源是在管理系统中动态维护的,并不可能在程序包中 ...
最新文章
- read write spinlock
- 将访问的文件夹变为磁盘盘符-摘自网络
- docker安装以及部署springboot项目
- 读书笔记——Accelerated C++ Chapter 12 使类对象获得数值功能
- Java 中import的用法,以及类的种类
- 阶段3 1.Mybatis_01.Mybatis课程介绍及环境搭建_04.mybatis概述
- 曲速未来 揭示:发现假EOS钱包窃取用户资金
- 图像处理经典算法及OpenCV程序
- 有限元法 matlab,MATLAB有限元分析与应用.pdf
- python爬虫获取城市天气信息
- ssm启动不报错_ssm整合 启动表现层报错。。。
- Ubuntu 和linux的关系
- windows合成pfx
- linux硬盘的两个分区合并_linux多个分区合并为一个分区
- 【华人学者风采】刘小平 中山大学
- 实现抖音闪烁效果---OpenCV-Python开发指南(54)
- 什么是邓氏编码DUNS NUMBER?
- 5G通信系统的Salen-Valenzula信道分析
- DC学习(时序分析和命令)
- Unity2D入门(八):游戏场景中的UI(主菜单与暂停菜单)