SpringBoot-WebMvcConfigurer详解

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)

	// 登录拦截器:不拦截请求路径
	List<String> excludePathPatterns = new LinkedList<>();
	excludePathPatterns.add("/loginController.do");
	excludePathPatterns.add("/loginController!login.do");
	excludePathPatterns.add("/loginController!registerPage.do");
	excludePathPatterns.add("/loginController!register.do");
	registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns(excludePathPatterns);

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 指向的资源提供不同的展现形式,可以使用户代理选择与用户需求相适应的最佳匹配(例如,文档使用的自然语言,图片的格式,或者内容编码形式)。
在这里插入图片描述

@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对象。

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值