SpringBoot之WebMvcConfigurer详解

目录

一、基本介绍

二、WebMvcConfigurer接口展示

三、常用方法列举

[3.1 addInterceptors:添加拦截器](#3.1 addInterceptors:添加拦截器)

[3.2 addResourceHandlers:添加静态资源](#3.2 addResourceHandlers:添加静态资源)

[3.3 addCorsMappings:添加跨域](#3.3 addCorsMappings:添加跨域)


编写的初衷是为了自己巩固复习,如果能帮到你将是我的荣幸❣️

一、基本介绍

WebMvcConfigurer配置类其实是Spring内部的一种配置方式,采用JavaBean的形式来代替传统的xml配置文件形式,针对框架个性化定制,可以自定义一些Handler,Interceptor,ViewResolver,MessageConverter。基于java-based方式的spring mvc配置,需要创建一个配置类并实现WebMvcConfigurer接口。

在Spring Boot 1.5版本都是靠重写WebMvcConfigurerAdapter的方法来添加自定义拦截器,消息转换器等。

SpringBoot 2.0 后,该类被标记为@Deprecated(弃用)。官方推荐直接实现WebMvcConfigurer或者直接继承WebMvcConfigurationSupport。

方式一实现WebMvcConfigurer接口(推荐),方式二继承WebMvcConfigurationSupport类。

二、WebMvcConfigurer接口展示

java 复制代码
public interface WebMvcConfigurer {
    void configurePathMatch(PathMatchConfigurer var1);
 
    void configureContentNegotiation(ContentNegotiationConfigurer var1);
 
    void configureAsyncSupport(AsyncSupportConfigurer var1);
 
    void configureDefaultServletHandling(DefaultServletHandlerConfigurer var1);
 
    void addFormatters(FormatterRegistry var1);
 
    void addInterceptors(InterceptorRegistry var1);
 
    void addResourceHandlers(ResourceHandlerRegistry var1);
 
    void addCorsMappings(CorsRegistry var1);
 
    void addViewControllers(ViewControllerRegistry var1);
 
    void configureViewResolvers(ViewResolverRegistry var1);
 
    void addArgumentResolvers(List<HandlerMethodArgumentResolver> var1);
 
    void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> var1);
 
    void configureMessageConverters(List<HttpMessageConverter<?>> var1);
 
    void extendMessageConverters(List<HttpMessageConverter<?>> var1);
 
    void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> var1);
 
    void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> var1);
 
    Validator getValidator();
 
    MessageCodesResolver getMessageCodesResolver();
}

三、常用方法列举

java 复制代码
 /* 拦截器配置 */
void addInterceptors(InterceptorRegistry var1);
/* 视图跳转控制器 */
void addViewControllers(ViewControllerRegistry registry);
/* 静态资源处理 */
void addResourceHandlers(ResourceHandlerRegistry registry);
/* 默认静态资源处理器 */
void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer);
/* 这里配置视图解析器 */
void configureViewResolvers(ViewResolverRegistry registry);
/* 配置内容裁决的一些选项*/
void configureContentNegotiation(ContentNegotiationConfigurer configurer);
/* 解决跨域问题 */
public void addCorsMappings(CorsRegistry registry) ;

3.1 addInterceptors:添加拦截器

  • addInterceptor:需要一个实现HandlerInterceptor接口的拦截器实例

  • addPathPatterns:用于设置拦截器的过滤路径规则;addPathPatterns("/**")对所有请求都拦截

  • excludePathPatterns:用于设置不需要拦截的过滤规则

  • 拦截器主要用途:进行用户登录状态的拦截,日志的拦截等。

java 复制代码
	/**
     * 添加拦截器配置
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns(
                        // 放行一些测试接口
                        "/",
                        "/test1",
                        // 放行静态资源目录
                        "/my/**",
                        // 放行登录接口
                        "/common/login",
                        // 放行swagger相关
                        "/swagger-resources/**",
                        "/webjars/**",
                        "/v2/**",
                        "/swagger-ui.html/**"
                );
    }

3.2 addResourceHandlers:添加静态资源

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

  • addResoureHandler:指的是对外暴露的访问路径

  • addResourceLocations:指的是内部文件放置的目录

注:如果继承WebMvcConfigurationSupport类实现配置时必须要重写该方法,具体见其它文章

java 复制代码
	/**
     * 自定义静态资源映射目录配置
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/my/**") // 指的是对外暴露的访问路径 如果添加了拦截器配置,一定要保证该路径是放行的才能直接访问,否则也要被拦截判断
                //.addResourceLocations("classpath:/static/");// 指的是内部文件放置的目录,classpath目录在spring boot中指的是resources文件夹,
                .addResourceLocations("file:H:\\image\\avatar\\");
        // 值得注意的是,配置的目录如果在classpath目录下,那么项目运行后,再往里面添加资源是看不到新添加的资源的,只有重启才能看见
        // 配置的目录在本地则没有影响
        // 当然,我们也可以选择在application.properties文件中通过spring.resources.static-locations=classpath:/haha/配置,
        // 如果什么都不配置的话,默认就是resource下的static目录存放静态资源,然后我们直接路径访问资源的名称.后缀即可。
        // 关于默认资源访问路径,我在Thymeleaf详细教程中有提到过,可以去看看。
    }

3.3 addCorsMappings:添加跨域

java 复制代码
	/**
     * 添加跨域配置
     * @param registry
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*") // 允许跨域的域名,可以用*表示允许任何域名使用
                .allowedHeaders("*") // *允许任何请求头
                .allowCredentials(true) // 允许携带cookie信息
                .allowedMethods("GET","POST","PUT","DELETE","OPTIONS"); // 允许哪些请求可以跨域
    }

前端注意项

vue的axios请求默认不会携带cookie参数,也就是说服务器无法判断浏览器的身份,每次请求的session都不一样,如果我们认证是基于cookie、session机制的,那么这样很显然是一个问题。

所以allowCredentials这个方法就是允许携带cookie参数。

但是前端必须做一件事,在main.js里写下面的代码设置,这样每次请求就会自动带上cookie信息:

javascript 复制代码
import axios from 'axios';
axios.defaults.withCredentials=true;

另外,这里再总结一下解决跨域问题的n种方法:

1.使用nginx代理

2.使用gateway网关代理

3.后端代码控制器方法上添加@CrossOrigin注解

4.后端代码WebMVCConfigurer实现类重写addCorsMappings方法

5.前端vue-cli开启代理服务器

相关推荐
骑鱼过海的猫123几秒前
【java】java通过s3访问ceph报错
java·ceph·iphone
杨充6 分钟前
13.观察者模式设计思想
java·redis·观察者模式
Lizhihao_8 分钟前
JAVA-队列
java·开发语言
喵叔哟18 分钟前
重构代码之移动字段
java·数据库·重构
喵叔哟18 分钟前
重构代码之取消临时字段
java·前端·重构
fa_lsyk20 分钟前
maven环境搭建
java·maven
Daniel 大东39 分钟前
idea 解决缓存损坏问题
java·缓存·intellij-idea
2401_8576363940 分钟前
共享汽车管理新纪元:SpringBoot框架应用
数据库·spring boot·汽车
wind瑞1 小时前
IntelliJ IDEA插件开发-代码补全插件入门开发
java·ide·intellij-idea
HappyAcmen1 小时前
IDEA部署AI代写插件
java·人工智能·intellij-idea