Spring boot 中 WebMvcConfigurationSupport 重要接口的应用场景详解

1、常用接口

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

2、应用场景

2.1 跨域访问

CORS(Cross-Origin Resource Sharing)“跨域资源共享”,是一个W3C标准,它允许浏览器向跨域服务器发送Ajax请求,打破了Ajax只能访问本站内的资源限制,CORS在很多地方都有被使用,微信支付的JS支付就是通过JS向微信服务器发送跨域请求。开放Ajax访问可被跨域访问的服务器大大减少了后台开发的工作,前后台工作也可以得到很好的明确以及分工,下面我们就看讲一下如何让你的SpringBoot项目支持CORS跨域。

配置跨域的坑
先看代码:

package com.test.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;


/**
 * @author houpeibin
 * @Date: 2020/2/10 17:21
 */

@Configuration
public class WebMvcConfigurer extends WebMvcConfigurationSupport {
    /**
     * 跨域访问配置接口
     * @param registry
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")
                .allowCredentials(true)
                .allowedHeaders("*")
                .maxAge(3600);
    }
}

坑坑坑
此方式是继承WebMvcConfigurationSupport 接口,重写addCorsMappings方法实现,但是使用此方法配置之后再使用自定义拦截器时跨域相关配置就会失效。
原因是请求经过的先后顺序问题,当请求到来时会先进入拦截器中,而不是进入Mapping映射中,所以返回的头信息中并没有配置的跨域信息。浏览器就会报跨域异常。

正确的解决跨域问题的方法是使用CorsFilter过滤器

private CorsConfiguration corsConfig() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
* 请求常用的三种配置,代表允许所有,当时你也可以自定义属性(比如header只能带什么,只能是post方式等等)
/
corsConfiguration.addAllowedOrigin("
");
corsConfiguration.addAllowedHeader("
");
corsConfiguration.addAllowedMethod("*");
corsConfiguration.setAllowCredentials(true);
corsConfiguration.setMaxAge(3600L);
return corsConfiguration;
}
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", corsConfig());
return new CorsFilter(source);
}

2.2 使用addInterceptors() 添加拦截器(点击查看详情)

2.3 使用addviewController()实现无业务逻辑跳转

需要实现WebMvcConfigurer类,重写addViewControllers方法。
添加@Configuration,等价于xml配置。

package com.test.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;

/**
 * @author houpeibin
 * @Date: 2020/2/10 17:21
 */

@Configuration
public class WebMvcConfigurer extends WebMvcConfigurationSupport {
    /**
     * 这里配置视图解析器
     * @param registry
     */
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("test").setViewName("emp/test");
    }
}

上面到的写法等价于:

@Controller
public class EmpContrller {
    @RequestMapping("test")
    public String test() { 
        return "emp/test";
    }
}

2.4 配置视图解析器 configureViewResolvers(ViewResolverRegistry registry)

从方法名称我们就能看出这个方法是用来配置视图解析器的,该方法的参数ViewResolverRegistry 是一个注册器,用来注册你想自定义的视图解析器等

package com.test.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;


/**
 * @author houpeibin
 * @Date: 2020/2/10 17:21
 */

@Configuration
public class WebMvcConfigurer extends WebMvcConfigurationSupport {
    /**
     * 这里配置视图解析器
     * @param registry
     */
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.jsp("/WEB-INF/jsp/", ".jsp");
        registry.enableContentNegotiation(new MappingJackson2JsonView());
    }
}

显然访问的所有jsp都是它进行解析的,该方法参数用来指定路径的前缀和文件后缀。对于以上配置,假如返回的视图名称是example,它会返回/WEB-INF/jsp/example.jsp给前端,找不到则报404  
注意: 在Springboot中,利用模板时,可以在配置文件进行配置。此章节用处不大,仅做理解,而且配这个之后,默认的配置就失效了。

2.5 静态资源处理(点击详细查询)

configureDefaultServletHandling 用户不大,此处不做介绍。

2.6总结

比较重要的三个接口如下:

	/** 解决跨域问题 **/
    public void addCorsMappings(CorsRegistry registry) ;
    
    /** 添加拦截器 **/
    void addInterceptors(InterceptorRegistry registry);
    
    /** 静态资源处理 **/
    void addResourceHandlers(ResourceHandlerRegistry registry);

这三个接口用处较大,特别是后两个接口,基本所有的项目中都会用到,请重点学习。

发布了21 篇原创文章 · 获赞 4 · 访问量 420

猜你喜欢

转载自blog.csdn.net/houpeibin2012/article/details/104250113