• springboot(14):WebMvcConfigurer配置类


    简介

    在Spring Boot 1.5版本及以前,靠重写WebMvcConfigurerAdapter的方法来添加自定义拦截器,消息转换器等。SpringBoot 2.0 后,该类被标记为@Deprecated(弃用)。官方推荐直接实现WebMvcConfigurer或者直接继承WebMvcConfigurationSupport。一般使用实现WebMvcConfigurer比较多,这里只讲这种方式。

    WebMvcConfigurer接口的源码如下:

    package org.springframework.web.servlet.config.annotation;
    
    import java.util.List;
    import org.springframework.format.FormatterRegistry;
    import org.springframework.http.converter.HttpMessageConverter;
    import org.springframework.lang.Nullable;
    import org.springframework.validation.MessageCodesResolver;
    import org.springframework.validation.Validator;
    import org.springframework.web.method.support.HandlerMethodArgumentResolver;
    import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
    import org.springframework.web.servlet.HandlerExceptionResolver;
    
    public interface WebMvcConfigurer {
        default void configurePathMatch(PathMatchConfigurer configurer) {
        }
    
        default void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        }
    
        default void configureAsyncSupport(AsyncSupportConfigurer configurer) {
        }
    
        default void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        }
    
        default void addFormatters(FormatterRegistry registry) {
        }
    
        default void addInterceptors(InterceptorRegistry registry) {
        }
    
        default void addResourceHandlers(ResourceHandlerRegistry registry) {
        }
    
        default void addCorsMappings(CorsRegistry registry) {
        }
    
        default void addViewControllers(ViewControllerRegistry registry) {
        }
    
        default void configureViewResolvers(ViewResolverRegistry registry) {
        }
    
        default void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        }
    
        default void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {
        }
    
        default void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        }
    
        default void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        }
    
        default void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
        }
    
        default void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
        }
    
        @Nullable
        default Validator getValidator() {
            return null;
        }
    
        @Nullable
        default MessageCodesResolver getMessageCodesResolver() {
            return null;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71

    接口方法比较多,下面只讲常用一些方法。

    常用方法

    addInterceptors:拦截器

    addInterceptors方法用来添加拦截器。前面具体讲过拦截器使用,具体用法可参考文章:拦截器

    addViewControllers:页面跳转

    以前写SpringMVC的时候,如果需要访问一个页面,必须要写Controller类,然后再写一个方法跳转到页面。现在可以重写WebMvcConfigurer中的addViewControllers方法实现。

        @Override
        public void addViewControllers(ViewControllerRegistry registry) {
            registry.addViewController("/toLogin").setViewName("login");
        }
    
    • 1
    • 2
    • 3
    • 4

    当访问路由/toLogin时,会跳转到login。

    addResourceHandlers:静态资源

    用于自定义静态资源映射目录。

    @Configuration
    public class MyWebMvcConfigurerAdapter implements WebMvcConfigurer {
        /**
         * 配置静态访问资源
         * @param registry
         */
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/my/**").addResourceLocations("classpath:/my/");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

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

    configureDefaultServletHandling:默认静态资源处理器

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
            configurer.enable();
            configurer.enable("defaultServletName");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    此时会注册一个默认的Handler:DefaultServletHttpRequestHandler,这个Handler也是用来处理静态文件的,它会尝试映射/。当DispatcherServelt映射/时(/ 和/ 是有区别的),并且没有找到合适的Handler来处理请求时,就会交给DefaultServletHttpRequestHandler 来处理。注意:这里的静态资源是放置在web根目录下,而非WEB-INF 下。

    configureViewResolvers:视图解析器

    这个方法是用来配置视图解析器的,该方法的参数ViewResolverRegistry 是一个注册器,用来注册你想自定义的视图解析器等。

    /**
     * 配置请求视图映射
     * @return
     */
    @Bean
    public InternalResourceViewResolver resourceViewResolver()
    {
    	InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();
    	//请求视图文件的前缀地址
    	internalResourceViewResolver.setPrefix("/WEB-INF/jsp/");
    	//请求视图文件的后缀
    	internalResourceViewResolver.setSuffix(".jsp");
    	return internalResourceViewResolver;
    }
     
    /**
     * 视图配置
     * @param registry
     */
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
    	super.configureViewResolvers(registry);
    	registry.viewResolver(resourceViewResolver());
    	/*registry.jsp("/WEB-INF/jsp/",".jsp");*/
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    addCorsMappings:跨域

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        super.addCorsMappings(registry);
        registry.addMapping("/cors/**")
                .allowedHeaders("*")
                .allowedMethods("POST","GET")
                .allowedOrigins("*");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    configureMessageConverters:信息转换器

     
    /**
    * 消息内容转换配置
     * 配置fastJson返回json转换
     * @param converters
     */
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        //调用父类的配置
        super.configureMessageConverters(converters);
        //创建fastJson消息转换器
        FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
        //创建配置类
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        //修改配置返回内容的过滤
        fastJsonConfig.setSerializerFeatures(
                SerializerFeature.DisableCircularReferenceDetect,
                SerializerFeature.WriteMapNullValue,
                SerializerFeature.WriteNullStringAsEmpty
        );
        fastConverter.setFastJsonConfig(fastJsonConfig);
        //将fastjson添加到视图消息转换器列表内
        converters.add(fastConverter);
     
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    参考:
    https://blog.csdn.net/fmwind/article/details/81235401
    https://blog.csdn.net/zhangpower1993/article/details/89016503#t3

  • 相关阅读:
    Vue2 05 计算属性
    nginx使用详解:转发规则、负载均衡、server_name
    35 WEB漏洞-逻辑越权之找回机制及接口安全
    React源码分析(三):useState,useReducer
    使用SpringBoot+Dubbo搭建微服务笔记
    vue深拷贝的几种实现方式
    FastAPI获年度第一新兴框架,2021年最受欢迎的TOP 100开发工具出炉
    永州植物细胞实验室建设布局方案
    基于企鹅优化算法的机器人轨迹规划(Matlab代码实现)
    【Mysql】复合查询详解+实战操作(多表查询、自链接、子查询等)
  • 原文地址:https://blog.csdn.net/qq_43745578/article/details/128055886