spring boot中WebMvcConfigurationAdapter抽象类的作用

这个类是SpringBoot内部提供专门处理用户自行添加的配置,里面不仅仅包含了修改视图的过滤还有其他很多的方法,包括我们后面章节要讲到的拦截器,过滤器,Cors配置等。

开始前还是有点要注意的:

springBoot 的版本从1.x 升级到 2 之后WebMvcConfigurerAdapter就发现这个抽象类已经过时了,查看源码就知道,在springboot 1.x中WebMvcConfigurerAdapter是实现了WebMvcConfigurer接口。现在spring boot 2.x版本直接使用WebMvcConfigurer。

spring boot 1.x    2.x版本,都有WebMvcConfigurationSupport可以实现和WebMvcConfigurerAdapter相同的功能。但是有点问题,使用WebMvcConfigurationSupport会出现application.yml中配置的静态资源不能访问。这时候启动项目时会发现映射根本没有成功,也就是说application.properties中添加配置的映射配置没有启动作用,然后我们会想到重写addResourceHandlers方法来进行映射:

@Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
 
        registry.addResourceHandler("/sh/static/**").addResourceLocations("classpath:/static/");
 
        super.addResourceHandlers(registry);
    }

首先说说spring boot 对静态资源访问,我们把静态资源放在src/main/resource/static中不需要配置就可以访问到,但是我们想自定义静态资源的路径,就要用到WebMvcConfigurerAdapter。定义一个配置类并继承WebMvcConfigurerAdapter,无需使用@EnableWebMvc注解

一、自定义资源映射addResourceHandlers

比如,我们想自定义静态资源映射目录的话,只需重写addResourceHandlers方法即可。

spring boot中WebMvcConfigurationAdapter抽象类的作用_第1张图片

通过addResourceHandler添加映射路径,然后通过addResourceLocations来指定路径。我们访问自定义my文件夹中的elephant.jpg 图片的地址为http://localhost:8080/my/elephant.jpg

如果你想指定外部的目录也很简单,直接addResourceLocations指定即可,代码如下:

spring boot中WebMvcConfigurationAdapter抽象类的作用_第2张图片

addResourceLocations指的是文件放置的目录,addResoureHandler指的是对外暴露的访问路径

二、页面跳转addViewControllers

以前写SpringMVC的时候,如果需要访问一个页面,必须要写Controller类,然后再写一个方法跳转到页面,感觉好麻烦,其实重写WebMvcConfigurerAdapter中的addViewControllers方法即可达到效果了

 

spring boot中WebMvcConfigurationAdapter抽象类的作用_第3张图片

在这里重写addViewControllers方法,并不会覆盖WebMvcAutoConfiguration中的addViewControllers(在此方法中,Spring Boot将“/”映射至index.html),这也就意味着我们自己的配置和Spring Boot的自动配置同时有效,这也是我们推荐添加自己的MVC配置的方式。

三、拦截器addInterceptors

拦截器在我们项目中经常使用的,这里就来介绍下最简单的判断是否登录的使用。

要实现拦截器功能需要完成以下2个步骤:

  • 创建我们自己的拦截器类并实现 HandlerInterceptor 接口

  • 其实重写WebMvcConfigurerAdapter中的addInterceptors方法把自定义的拦截器类添加进来即可

首先,自定义拦截器代码:

spring boot中WebMvcConfigurationAdapter抽象类的作用_第4张图片

这里我们简单实现了根据session中是否有User对象来判断是否登录,为空就跳转到登录页,不为空就通过。

接着,重写WebMvcConfigurerAdapter中的addInterceptors方法如下:

spring boot中WebMvcConfigurationAdapter抽象类的作用_第5张图片

addPathPatterns("/**")对所有请求都拦截,但是排除了/toLogin和/login请求的拦截。

页面登录关键代码:

spring boot中WebMvcConfigurationAdapter抽象类的作用_第6张图片

控制器代码:

spring boot中WebMvcConfigurationAdapter抽象类的作用_第7张图片

这样访问的时候,如果未登录就会跳转到login.html页面,而访问http://localhost:8080/toLogin 和http://localhost:8080/login 不会被拦截。

 

更多配置可以查看WebMvcConfigurerAdapter的类的API。因其是WebMvcConfigurer接口的实现,所以WebMvcConfigurer的API方法也可以用来配置MVC。

只是实现这个接口的话,要实现所有的方法,这个就尴尬了。

所以还是推荐使用继承WebMvcConfigurerAdapter类来处理。

你可能感兴趣的:(spring,boot)