`

164. 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中的设置。

 

2extends WebMvcConfigurationSupport

在扩展的类中重写父类的方法即可,这种方式会屏蔽Spring Boot@EnableAutoConfiguration中的设置。

 

3extends WebMvcConfigurationAdapter

在扩展的类中重写父类的方法即可,这种方式依旧使用Spring Boot@EnableAutoConfiguration中的设置

@EnableWebMvc注解的作用: 就是把WebMvcConfigurationSupport中的配置加载过来,你继承WebMvcConfigurerAdapter时自定义的一些配置会覆盖WebMvcConfigurationSupport 里的默认配置。

 

 

2.4 总结

我们上面代码使用的是3extends WebMvcConfigurationAdapter:这种方式依旧使用了spring boot@EnableAutoConfiguration的设置,也就是@EnableWebMvc的配置也是生效的,那么WebMvcConfigurationSupport中的配置就会被加载进来,而我们继承的WebMvcConfigurerAdapter覆盖的方法又会覆盖WebMvcConfigurationSupport里的默认配置。好了,本篇文章就到这里,希望你能有所收获。

 

à悟空学院:https://t.cn/Rg3fKJD

学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!

SpringBoot视频:http://t.cn/A6ZagYTi

Spring Cloud视频:http://t.cn/A6ZagxSR

SpringBoot Shiro视频:http://t.cn/A6Zag7IV

SpringBoot交流平台:https://t.cn/R3QDhU0

SpringData和JPA视频:http://t.cn/A6Zad1OH

SpringSecurity5.0视频:http://t.cn/A6ZadMBe

Sharding-JDBC分库分表实战http://t.cn/A6ZarrqS

分布式事务解决方案「手写代码」:http://t.cn/A6ZaBnIr 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics