欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringBoot-WebMvcConfigurer详解

程序员文章站 2022-03-18 13:47:10
...

1. 简介

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

在SpringBoot 1.5版本都是靠重写 WebMvcConfigurerAdapter 的方式来添加自定义拦截器,消息转换器等。SpringBoot2.0 后,该类被标识为@Deprecated。官方推荐直接实现WebMvcConfigurer(推荐)或者直接继承WebMVCConfigurationSupport

2. WebMvcconfigurer接口

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常用接口:
1.addInterceptors:拦截器
2.addViewControllers:页面跳转
3. addResourceHandlers:静态资源
4. configureDefaultServletHandling:默认静态资源处理器
5. configureViewResolvers:视图解析器
6. configureContentNegotiation:配置内容裁决的一些参数
7. addCorsMappings:跨域
8. configureMessageConverters:信息转换器

3. WebMvcConfigurer接口详解

3.1 配置拦截器 addInterceptors(InterceptorRegistry registry)

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

public InterceptorRegistration addInterceptor(HandlerInterceptor interceptor) {
    InterceptorRegistration registration = new InterceptorRegistration(interceptor);
    this.registrations.add(registration);
    return registration;
}

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

public InterceptorRegistration addPathPatterns(String... patterns) {
    return this.addPathPatterns(Arrays.asList(patterns));
}
public InterceptorRegistration addPathPatterns(List<String> patterns) {
    this.includePatterns.addAll(patterns);
    return this;
}

excludePathPatterns: 用于设置不需要拦截的过滤规则;excludePathPatterns("/emp/toLogin","/js/**","/css/**","/images/**")

public InterceptorRegistration excludePathPatterns(String... patterns) {
    return this.excludePathPatterns(Arrays.asList(patterns));
}
public InterceptorRegistration excludePathPatterns(List<String> patterns) {
    this.excludePatterns.addAll(patterns);
    return this;
}

HandlerInterceptor接口:

public interface HandlerInterceptor {
	// 在请求处理之前进行调用(Controller方法调用之前)
	// 只有返回true才会继续向下执行,返回false取消当前请求。
    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
	// 请求处理之后调用,但在视图被渲染之前
    default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
    }
	// 在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要用于进行资源清理工作)
    default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
    }
}

3.2 页面跳转addViewControllers(ViewControllerRegistry registry)

以前写SpringMVC的时候,如果需要访问一个页面,必须要写Controller类,然后再写一个方法跳转到页面,感觉好麻烦,其实重写WebMvcConfigurer中的addViewControllers方法即可达到效果了

	@Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/toLogin").setViewName("login");
    }

注意:这里重写addViewControllers方法,并不会覆盖WebMvcAutoConfiguration(SpringBoot自动配置)中的addViewControllers(在此方法中,SpringBoot将”/”映射至index.html),这也就意味着这里的配置和SpringBoot的自动配置同时有效。

3.3 配置自定义静态资源映射目录 addResourceHandlers(ResourceHandlerRegistry registry)

	@Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/my/**").addResourceLocations("classpath:/my/");
    }

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

addResourceLocations:指的是内部文件存放的目录(真实路径,windows/linux当服务器的情况下,前面一定要加上一个file: 比如:file:E:/xxx/ )

值得一提的是,如果你的项目是war包启动,一般都是再Tomcat中配置一下;如果是jar包启动(SpringBoot经常用这种方式启动),就可以用到这个方法了。

3.4 配置默认静态资源处理器 configureDefaultServletHanding(DefaultServletHandler

Configurer configurer)

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

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

3.5.1 配置请求视图映射

@Bean
Public InternalResourceViewResolver internalResourceViewResolver() {
	InternalResourceViewResolver obj = new InternalResourceViewResolver();
	// 请求视图前缀
	obj.setPrefix(/WEB-INF/jsp/);
	// 请求视图后缀
	obj.setSuffix(.jsp”);
	return obj;
}

3.5.2 视图配置

@Override
Public void configureViewResolvers(ViewResolverRegistry registry) {
	/*registry.jsp("/WEB-INF/jsp/",".jsp");*/
	registry.viewResolver(internalResourceViewResolver());
}

3.6 配置内容协商的一些参数configureContentNegotiation(ContentNegotiationConfigurer configurer)

内容协商: 在 HTTP 协议中,内容协商是这样一种机制,通过为同一 URI 指向的资源提供不同的展现形式,可以使用户代理选择与用户需求相适应的最佳匹配(例如,文档使用的自然语言,图片的格式,或者内容编码形式)。
SpringBoot-WebMvcConfigurer详解

@Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        /* 是否通过请求Url的扩展名来决定media type */
        configurer.favorPathExtension(true)
                /* 不检查Accept请求头 */
                .ignoreAcceptHeader(true)
                .parameterName("mediaType")
                /* 设置默认的media yype */
                .defaultContentType(MediaType.TEXT_HTML)
                /* 请求以.html结尾的会被当成MediaType.TEXT_HTML*/
                .mediaType("html", MediaType.TEXT_HTML)
                /* 请求以.json结尾的会被当成MediaType.APPLICATION_JSON*/
                .mediaType("json", MediaType.APPLICATION_JSON);
}

上面代码说白了就是告诉系统什么类型用什么来标识。

3.7 配置跨域 addCorsMappings(CorsRegistry registry)

@Override
public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/cors/**")
            .allowedHeaders("*")
            .allowedMethods("POST","GET")
            .allowedOrigins("*");
}

3.8 配置信息转换器 configureMessageConverters(List<HttpMessageConverter<?>> converters)

这个配置一般针对于Api接口服务程序,配置在请求返回时内容采用什么转换器进行转换,我们最常用到的就是fastJson的转换,配置如下所示:

/**
     * 消息内容转换配置
     * 配置fastJson返回json转换
     * @param converters
     */
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        /1.需要定义一个convert转换消息的对象;
        FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
        //2.添加fastJson的配置信息,比如:是否要格式化返回的json数据;
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat,
                SerializerFeature.WriteMapNullValue,
                SerializerFeature.WriteNullStringAsEmpty,
                SerializerFeature.DisableCircularReferenceDetect,
                SerializerFeature.WriteNullListAsEmpty,
                SerializerFeature.WriteDateUseDateFormat);
        //3处理中文乱码问题
        List<MediaType> fastMediaTypes = new ArrayList<>();
        fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
        //4.在convert中添加配置信息.
        fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
        fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
        //5.将convert添加到converters当中.
        converters.add(fastJsonHttpMessageConverter);
}

内容转换都是针对面向接口进行编写的实现类,都必须implements HttpMessageConverter接口完成方法的实现。

3.9 配置异步请求处理 configureAsyncSupport(AsyncSupportConfigurer configurer)

处理异步请求。只能设置两个值,一个超时时间(毫秒,Tomcat下默认是10000毫秒,即10秒),还有一个是AsyncTaskExecutor 异步任务执行器。

3.10 addFormatters(FormatterRegistry registry)

增加转换器或者格式化器。这边不仅可以把时间转化成你需要时区或者样式。还可以自定义转化器和你数据库做交互,比如传进来userId,经过转化可以拿到user对象。

相关标签: 微服务与分布式