zoukankan      html  css  js  c++  java
  • WebMvcConfigurerAdapter详解和过时后的替代方案

    一、什么是WebMvcConfigurerAdapter

    Spring内部的一种配置方式
    采用JavaBean的形式来代替传统的xml配置文件形式进行针对框架个性化定制

    二、WebMvcConfigurerAdapter常用的方法

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

    1、addInterceptors:拦截器

    • addInterceptor:需要一个实现HandlerInterceptor接口的拦截器实例
    • addPathPatterns:用于设置拦截器的过滤路径规则

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

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").excludePathPatterns("/toLogin","/login");
            super.addInterceptors(registry);
    }
    

    2、addCorsMappings:跨域

        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**").allowedOrigins("*").allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE").maxAge(3600).allowCredentials(true);
        }
    

    3、addViewControllers:跳转指定页面

        /**
         * 以前要访问一个页面需要先创建个Controller控制类,在写方法跳转到页面
         * 在这里配置后就不需要那么麻烦了,直接访问http://localhost:8080/toLogin就跳转到login.html页面了
         *
         * @param registry
         */
        @Override
        public void addViewControllers(ViewControllerRegistry registry) {
            registry.addViewController("/toLogin").setViewName("login");
            registry.addViewController("/").setViewName("/index");
            registry.addViewController("/login").setViewName("forward:/index.html");
            super.addViewControllers(registry);
        }
    

    4、resourceViewResolver:视图解析器

    /**
     * 配置请求视图映射
     * @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");*/
    }
    

    5、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);
    
    }

    6、addResourceHandlers:静态资源

        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            //自定义项目内目录
            //registry.addResourceHandler("/my/**").addResourceLocations("classpath:/my/");
            //指向外部目录
            registry.addResourceHandler("/my/**").addResourceLocations("file:E:/my/");
            super.addResourceHandlers(registry);
        }
    

    三、使用WebMvcConfigurerAdapter

    1、过时方式:继承WebMvcConfigurerAdapter

     该方法在spring boot 2.0,Spring 5.0 之后,已经被废弃 

    @Configuration
    public class WebConfig extends WebMvcConfigurerAdapter {
    	//TODO
    }

    2、代替方案

     ①直接实现WebMvcConfigurer

    @Configuration
    public class WebMvcConfg implements WebMvcConfigurer {
    	//TODO
    }
    

    ②直接继承WebMvcConfigurationSupport

    @Configuration
    public class WebMvcConfg extends WebMvcConfigurationSupport {
    	//TODO
    }

    查看源码发现: WebMvcConfigurerAdapter只是对WebMvcCofigurer的空实现

    WebMvcConfigurationSupport与WebMvcConfigurerAdapter、接口WebMvcConfigurer处于同一个目录下

    WebMvcConfigurationSupport包含WebMvcConfigurer里面的方法,且WebMvcConfigurationSupport的实现的方法更全面

    但是继承WebMvcConfigurationSupport会发现Spring Boot的WebMvc自动配置失效(WebMvcAutoConfiguration自动化配置),导致无法视图解析器无法解析并返回到对应的视图。

    关于使用新方案会出现的问题,可以参考下面这篇文章。

    WebMvcConfigurer 与 WebMvcConfigurationSupport避坑指南

  • 相关阅读:
    关于oracle的一些操作
    关于List的一些操作
    XSS挑战赛(2)
    阿里云图床搭建
    XSS挑战赛(1)
    Shiro remeberMe反序列化漏洞复现(Shiro-550)
    HTTP慢速拒绝服务攻击(Slow HTTP Dos)
    从Excel获取整列内容进行批量扫描
    PHP代码审计分段讲解(14)
    PHP代码审计分段讲解(13)
  • 原文地址:https://www.cnblogs.com/sueyyyy/p/11608900.html
Copyright © 2011-2022 走看看