文章目录

  • 一、WebMvcConfigurer接口
  • 1.介绍
  • 2.WebMvcConfigurer源码
  • 1.接口源码
  • 2.WebMvcConfigurer接口方法说明
  • 二、示例代码实现
  • 1.注册自定义拦截器
  • 2.新增自定义FastJsonHttpMessageConverter


一、WebMvcConfigurer接口

1.介绍

如果要在Spring Boot2中注册一些自定义的拦截器、类型转换器、跨域设置等操作,则需要自定义Spring MVC配置。在Spring Boot 1.5版本都是靠重写WebMvcConfigurerAdapter的方法来添加自定义拦截器,消息转换器等,从Spring5.0开始废弃了WebMvcConfigurerAdapter类,所以在Spring Boot2中实现 WebMvcConfigurer这个接口即可。

spring authorization server改造 springmvc改造springboot_自定义

2.WebMvcConfigurer源码

1.接口源码

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;
    }
}

可以看到WebMvcConfigurer里面都是Java8的默认方法。

2.WebMvcConfigurer接口方法说明

1.default void addResourceHandlers(ResourceHandlerRegistry registry) {}
通过覆写这个方法来定制静态资源路径映射,Spring Boot默认的静态资源配置是把类路径下的/static、/public、/resources和META-INF/resources文件夹的静态文件直接映射为/**。

@Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        /**
         *静态资源请求/person/** 映射到类路径下的/static/person/ 目录
         */
        registry.addResourceHandler("/person/**")
                .addResourceLocations("classpath:/static/person/");
    }

2.default void addInterceptors(InterceptorRegistry registry){}
通过覆写这个方法来添加拦截器
3.default void addCorsMappings(CorsRegistry registry){}
通过覆写这个方法实现跨域配置的支持

@Override
    public void addCorsMappings(CorsRegistry registry) {
        //配置允许跨域的路径
        registry.addMapping("/**")
                //配置允许访问的跨域资源的请求域名
                .allowedOrigins("*")
                //配置允许访问该跨域资源服务器的请求方法
                .allowedHeaders("GET,POST")
                //配置允许请求 头部head的访问
                .allowedHeaders("*");
    }

4.default void addViewControllers(ViewControllerRegistry registry) {}
通过覆写这个方法来实现视图控制器配置
5.default void configureMessageConverters(List<HttpMessageConverter<?>> converters){}
通过覆写这个方法来新增自定义的HttpMessageConverter(消息转换器)
在Spring Boot中,HttpMessageConvertersAutoConfiguration类默认自动注册了StringHttpMessageConverter,还有通过@Import注解注册了JacksonHttpMessageConverterConfiguration和GsonHttpMessageConverterConfiguration。
6.default void addFormatters(FormatterRegistry registry){}
通过覆写这个方法来添加数据格式器。Spring MVC接收HTTP请求会把请求参数自动绑定映射到Controller请求参数上。Spring 中没有默认配置将字符串转换为日期类型。可以通过添加一个DateFormatter类来实现自动转换。

@Override
    public void addFormatters(FormatterRegistry registry) {
        //字符串类型转为日期类型
        registry.addFormatter(new DateFormatter("yyyy-MM-dd"));
    }

7.default void configureViewResolvers(ViewResolverRegistry registry){}
通过覆写这个方法来配置视图解析器。比如配置FreeMarker、Thymeleaf 等视图解析器。

二、示例代码实现

1.注册自定义拦截器

**
 * 自定义拦截器
 * 拦截器主要作用是拦截用户的请求并进行相应的处理。比如通过拦截器来进行用户权限验证,或者用来判断当前用户是否已经登录等。
 *
 * @author David Lin
 * @version: 1.0
 * @date 2020-02-09 22:03
 */
@Slf4j
public class MyInterceptor implements HandlerInterceptor {
    /**
     * 该方法将在请求处理之前被调用
     *
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response, Object handler) throws Exception {
        log.error("自定义的拦截器调用了1");
        return true;
    }

    /**
     * 该方法在当前请求被处理之后,也就是Controller方法被调用之后执行。
     * 在DispatcherServlet进行视图返回渲染之前被调用
     *
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response,
                           Object handler, ModelAndView modelAndView) throws Exception {
        log.error("自定义的拦截器调用了2");
    }

    /**
     * 该方法将在整个请求结束之后,也就是DispatcherServlet渲染了对应的视图之后执行。
     *
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
                                Object handler, Exception ex) throws Exception {

    }
}
**
 * 自定义MVC配置
 *
 * @author David Lin
 * @version: 1.0
 * @date 2020-02-09 18:21
 */
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //注册自定义拦截器
        registry.addInterceptor(myInterceptor())
                //添加拦截路径 拦截所有请求
                .addPathPatterns("/**")
                //白名单 排除拦截路径
                .excludePathPatterns("/login", "/api", "/index", "/**/*.js", "/**/*.css", "/**/*.jpg", "/**/*.png");
    }

    @Bean
    public MyInterceptor myInterceptor() {
        return new MyInterceptor();
    }

2.新增自定义FastJsonHttpMessageConverter

1.引入Maven依赖

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.61</version>
</dependency>

2.代码实现

@Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        //新增自定义的HttpMessageConverter
        FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
        //创建FastJson配置类
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        //定制Json序列化策略
        fastJsonConfig.setSerializerFeatures(
                SerializerFeature.WriteNullNumberAsZero,
                SerializerFeature.WriteNullStringAsEmpty,
                SerializerFeature.WriteMapNullValue);

        fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);

        // 处理中文乱码问题
        List<MediaType> fastMediaTypes = new ArrayList<>();
        fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
        fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);

        converters.add(fastJsonHttpMessageConverter);
    }