需求缘起:

在之前有一篇博客中《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方法

具体实现代码:

Java代码 
  1. package com.kfit;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
  5. import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
  6. /**
  7. *
  8. * @author Angel --守护天使
  9. * @version v.0.1
  10. * @date 2016年7月29日下午7:06:11
  11. */
  12. @SpringBootApplication
  13. public class ApiCoreApp extends WebMvcConfigurationSupport{
  14. /**
  15. * 1、 extends WebMvcConfigurationSupport
  16. * 2、重写下面方法;
  17. * setUseSuffixPatternMatch : 设置是否是后缀模式匹配,如“/user”是否匹配/user.*,默认真即匹配;
  18. * setUseTrailingSlashMatch : 设置是否自动后缀路径模式匹配,如“/user”是否匹配“/user/”,默认真即匹配;
  19. */
  20. @Override
  21. public void configurePathMatch(PathMatchConfigurer configurer) {
  22. configurer.setUseSuffixPatternMatch(false)
  23. .setUseTrailingSlashMatch(true);
  24. }
  25. public static void main(String[] args) {
  26. SpringApplication.run(ApiCoreApp.class, args);
  27. }
  28. }

其中访问代码:

Java代码 
  1. @RequestMapping("/user")
  2. public String hello(){
  3. return "/user";
  4. }

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 问题解决

解决思路很简单,只需要替换一个继承类即可,看如下代码:

原先的为:

Java代码 
  1. @SpringBootApplication
  2. public class App extends WebMvcConfigurationSupport

替换为:

Java代码 
  1. @SpringBootApplication
  2. 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】相关推荐

  1. (38)Spring Boot分布式Session状态保存Redis【从零开始学Spring Boot】

    [本文章是否对你有用以及是否有好的建议,请留言] 在使用spring boot做负载均衡的时候,多个app之间的session要保持一致,这样负载到不同的app时候,在一个app登录之后,而访问到另外 ...

  2. 23. Spring Boot启动加载数据CommandLineRunner【从零开始学Spring Boot】

    2019独角兽企业重金招聘Python工程师标准>>> 102. Spring Boot之CommandLineRunner和ApplicationRunner[从零开始学Sprin ...

  3. 78. Spring Boot完美使用FastJson解析JSON数据【从零开始学Spring Boot】

    [原创文章,转载请注明出处] 个人使用比较习惯的json框架是fastjson,所以spring boot默认的json使用起来就很陌生了,所以很自然我就想我能不能使用fastjson进行json解析 ...

  4. springboot日志写入mysql_44. Spring Boot日志记录SLF4J【从零开始学Spring Boot】

    学院中有Spring Boot相关的课程!点击「阅读原文」进行查看! SpringSecurity5.0视频:http://t.cn/A6ZadMBe Sharding-JDBC分库分表实战: 在开发 ...

  5. 14. Spring Boot定时任务的使用【从零开始学Spring Boot】

    [视频 & 交流平台] à SpringBoot视频 http://study.163.com/course/introduction.htm?courseId=1004329008& ...

  6. (30)导入时如何定制spring-boot依赖项的版本【转载】【从零开始学Spring Boot】...

    此文章转载地址:http://www.tuicool.com/articles/RJJvMj3 请注重作者的版权. spring-boot通过maven的依赖管理为我们写好了很多依赖项及其版本,我们可 ...

  7. 54. spring boot日志升级篇—logback【从零开始学Spring Boot】

    在<44. Spring Boot日志记录SLF4J>章节中有关相关的介绍,这里我们在深入的了解下logback框架. 为什么要使用logback ? --在开发中不建议使用System. ...

  8. (10)Spring Boot修改端口号【从零开始学Spring Boot】

    Spring boot 默认端口是8080,如果想要进行更改的话,只需要修改applicatoin.properties文件,在配置文件中加入: server.port=9090 常用配置: #### ...

  9. 70.打印所有Spring boot载入的bean【从零开始学Spring Boot】

    [从零开始学习Spirng Boot-常见异常汇总] 问题的提出: 我们在开发过程当中,我们可能会碰到这样的问题:No qualifying bean  就是我们定义的bean无法进行注入,那到底是什 ...

  10. (13)处理静态资源(自定义资源映射)【从零开始学Spring Boot】

    上面我们介绍了Spring Boot 的默认资源映射,一般够用了,那我们如何自定义目录?  这些资源都是打包在jar包中的,然后实际应用中,我们还有很多资源是在管理系统中动态维护的,并不可能在程序包中 ...

最新文章

  1. read write spinlock
  2. 将访问的文件夹变为磁盘盘符-摘自网络
  3. docker安装以及部署springboot项目
  4. 读书笔记——Accelerated C++ Chapter 12 使类对象获得数值功能
  5. Java 中import的用法,以及类的种类
  6. 阶段3 1.Mybatis_01.Mybatis课程介绍及环境搭建_04.mybatis概述
  7. 曲速未来 揭示:发现假EOS钱包窃取用户资金
  8. 图像处理经典算法及OpenCV程序
  9. 有限元法 matlab,MATLAB有限元分析与应用.pdf
  10. python爬虫获取城市天气信息
  11. ssm启动不报错_ssm整合 启动表现层报错。。。
  12. Ubuntu 和linux的关系
  13. windows合成pfx
  14. linux硬盘的两个分区合并_linux多个分区合并为一个分区
  15. 【华人学者风采】刘小平 中山大学
  16. 实现抖音闪烁效果---OpenCV-Python开发指南(54)
  17. 什么是邓氏编码DUNS NUMBER?
  18. 5G通信系统的Salen-Valenzula信道分析
  19. DC学习(时序分析和命令)
  20. Unity2D入门(八):游戏场景中的UI(主菜单与暂停菜单)

热门文章

  1. 博图SCL 选择排序
  2. Azure Az-900认证 04——-考取AZ900所有知识点总结--获取证书!
  3. Pytorch创建多任务学习模型
  4. 考研高数 专题7:方程根的存在性及个数(零点定理-罗尔定理;单调性-罗尔定理推论)
  5. 学习笔记--数据通信与计算机网络
  6. 深度点击率预估模型的One-Epoch过拟合现象剖析
  7. 美团2018校园招聘内推笔试代码分享
  8. 电脑硬盘双击打不开,只能右键打开
  9. hexo入门学习(六):文章图片存储到七牛云
  10. 行梯形矩阵最简行阶梯矩阵