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

SpringBoot 扩展对SpringMVC的默认配置(拦截器等)

程序员文章站 2022-06-13 15:42:16
...

SpringBoot 默认已经做了很多SpringMVC的默认配置:

1、视图解析器ViewResolver

2、静态资料的目录

3、默认首页index.html

4、图标名字和图标所在目录,favicon.ico

5、类型转换器Converter,格式转换器的Formatter

6、消息转换器HttpMessageConverters,我们直接向页面返回JSON格式的数据就靠它实现

7、消息代码解析器MessageCodesResolver, 作用配置了错误代码显示规则的一些东西,JSR303数据校验要用到它

 

在项目开发中,这些默认配置是绝对不够用的,所以,必须在它们的基础上扩展更多我们需要的配置。

SpringBoot 提供了相应扩展接口WebMvcConfigurer,在SpringBoot的配置类上实现它并加上@Configuretion注解就可以了

  SpringBoot 扩展对SpringMVC的默认配置(拦截器等)

 

一、addViewControllers 的使用

       在直接使用SpringMVC时,可以在springmvc.xml配置文件中直接配置:

<mvc:view-controller path="/index" view-name="index"/>

       可实现不用在controller类里写映射方法,访问url可直接打开视图页面,视图模板引擎是必须的。

       SpringBoot 中创建配置类,实现接口WebMvcConfigurer

@Configuration
public class AddMvcConfig implements WebMvcConfigurer {

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

    index.html 简单展示下:

     SpringBoot 扩展对SpringMVC的默认配置(拦截器等)

注意:

     1)关于扩展,有一个特殊的注解 @EnableWebMvc ,它的作用是全面接管SpringMvc的配置,也就是说SpringBoot的所有关于SpringMvc的自动配置都会失效(包括静态资源页的访问等等),而只有我们自己做的配置才会生效,所以什么都需要我们自己手动配置所有的类。

    2)官方解释:

       如果要保留Spring Boot MVC功能,并且要添加其他MVC配置(拦截器、格式化程序、视图控制器和其他功能),可以添加自己的@configuration类(类型为webmvcconfigurer),但不添加@enableWebMVC。如果要提供RequestMappingHandlerMapping、RequestMappingHandlerAdapter或ExceptionHandlerExceptionResolver的自定义实例,可以声明WebMVCregistrationsAdapter实例以提供此类组件。

      如果要完全控制SpringMVC,可以添加自己的@configuration,并用@enableWebMVC注释。

   

二、addInterceptors 的拦截器使用

   1)在配置类中添加 拦截器配置

@Configuration
public class WebConfig implements WebMvcConfigurer {
    /**
     *  配置拦截器
     * @param registry
     */
   @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/login", "/", "/index");
    }
}

   2)创建拦截器实现类

public class LoginInterceptors extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle 方法。。。");
        return super.preHandle(request, response, handler);
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle 方法。。。");
        super.postHandle(request, response, handler, modelAndView);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
                                Exception ex) throws Exception {
        System.out.println("afterCompletion 方法。。。");
        super.afterCompletion(request, response, handler, ex);
    }

    @Override
    public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response,
                                               Object handler) throws Exception {
        System.out.println("afterConcurrentHandlingStarted 方法。。。");
        super.afterConcurrentHandlingStarted(request, response, handler);
    }
}

preHandle:预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器返回值:true表示继续流程(如调用下一个拦截器或处理器);false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应。

postHandle:后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。

afterCompletion:整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中preHandle返回true的拦截器才会执行。

  3)访问url 接口拦截:

  SpringBoot 扩展对SpringMVC的默认配置(拦截器等)

 

参考文章:https://blog.csdn.net/She_lock/article/details/86241685

ends ~