WebMvcConfigurerAdapter、WebMvcConfigurer、WebMvcConfigurationSupport

2023-09-18 16:39:28

WebMvcConfigurerAdapter、WebMvcConfigurer、WebMvcConfigurationSupport的关系?

WebMvcConfigurerAdapter、WebMvcConfigurer和WebMvcConfigurationSupport是Spring MVC框架中用于配置Web应用程序的类。WebMvcConfigurerAdapter是WebMvcConfigurer的过时实现类,WebMvcConfigurationSupport是WebMvcConfigurer的抽象实现类。

WebMvcConfigurerAdapter:是一个已过时的类,它实现了WebMvcConfigurer接口,并提供了一些默认的实现方法。在Spring 5.0版本之后,推荐直接实现WebMvcConfigurer接口而不是继承WebMvcConfigurerAdapter。

WebMvcConfigurer:是一个接口,用于配置Spring MVC的行为。提供了一系列的回调方法,可以在进行自定义配置,例如添加拦截器、配置视图解析器、配置消息转换器等。

WebMvcConfigurationSupport:是一个抽象类,实现了WebMvcConfigurer接口,并提供了一些默认的配置。如果需要更深入地定制Spring MVC的行为,可以继承该类并重写相应的方法。可以自定义一些配置,比如添加拦截器、过滤器等。在这个类中,可以通过重写addInterceptors()方法来添加拦截器,通过重写addCorsMappings()方法来配置跨域请求,通过重写addResourceHandlers()方法来配置静态资源的访问路径等。


拦截器和过滤器执行顺序?

拦截器和过滤器的执行顺序如下:

  1. 过滤器(Filter)的执行顺序:

    • 根据web.xml中的配置顺序执行过滤器。
    • 如果使用注解配置过滤器,则根据过滤器的@Order注解值来确定执行顺序,值越小越先执行。
  2. 拦截器(Interceptor)的执行顺序:

    • 根据配置的拦截器顺序来执行。
    • 如果使用注解配置拦截器,则根据拦截器的@Order注解值来确定执行顺序,值越小越先执行。

在Spring MVC中,拦截器的接口是HandlerInterceptor,它定义了三个方法:

  1. preHandle:在处理请求之前被调用,可以进行一些前置处理操作。如果该方法返回false,则请求将被终止,后续的拦截器和处理器将不会被执行。

  2. postHandle:在处理请求之后、渲染视图之前被调用,可以进行一些后置处理操作。可以通过该方法修改ModelAndView对象。

  3. afterCompletion:在整个请求完成之后被调用,可以进行一些资源清理操作。

除了HandlerInterceptor接口,Spring MVC还提供了一个抽象类HandlerInterceptorAdapter,它实现了HandlerInterceptor接口,并提供了空实现的方法,方便开发者只需要重写需要的方法。

HandlerInterceptor是Spring MVC拦截器的核心接口,它定义了拦截器的执行流程和方法。拦截器通过实现HandlerInterceptor接口或继承HandlerInterceptorAdapter类来实现自定义的拦截器。在Spring MVC中,可以通过配置拦截器来实现对请求的拦截和处理。

总结来说,HandlerInterceptor是拦截器的接口,定义了拦截器的方法;而Spring MVC拦截器是通过实现HandlerInterceptor接口或继承HandlerInterceptorAdapter类来实现的。

拦截器和过滤器是两个不同的概念,拦截器是基于Java的反射机制实现的,而过滤器是基于Servlet规范的。拦截器只能拦截到Controller层的请求,而过滤器可以拦截到所有的请求。

在Spring MVC中,拦截器的执行顺序优先于过滤器的执行顺序。也就是说,先执行拦截器,再执行过滤器。


WebMvcConfigurer

WebMvcConfigurer接口添加拦截器、自定义视图解析器和配置消息转换器示例代码:

//在Spring MVC中,拦截器是一种用于拦截请求并在处理请求之前或之后执行特定操作的组件。拦截器可以用于实现日志记录、权限验证、参数校验等功能
@Component
public class MyInterceptor implements HandlerInterceptor {
 
    //preHandle:在处理请求之前被调用,可以进行一些前置处理操作。如果该方法返回false,则请求将被终止,后续的拦截器和处理器将不会被执行。
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		System.out.println("MyInterceptor preHandle");
		return true;
	}
 
    //在处理请求之后、渲染视图之前被调用,可以进行一些后置处理操作。可以通过该方法修改ModelAndView对象
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
		System.out.println("MyInterceptor postHandle");
	}
 
    //在整个请求完成之后被调用,可以进行一些资源清理操作
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
		System.out.println("MyInterceptor afterCompletion");
	}
}
@EnableWebMvc
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Autowired
    private MyInterceptor myInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor);
    }
    
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.jsp("/WEB-INF/views/", ".jsp");
    }
    
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(new MappingJackson2HttpMessageConverter());
    }
}

MyInterceptor是自定义的拦截器,MappingJackson2HttpMessageConverter用于JSON数据转换的消息转换器。上述使用@EnableWebMvc注解来启用Spring MVC的默认配置,并实现了WebMvcConfigurer接口来添加拦截器、自定义视图解析器、配置消息转换器。在addInterceptors方法中,将MyInterceptor添加到了拦截器链中,并指定了拦截的路径。在configureViewResolvers方法中,使用了JSP视图解析器,并指定了视图文件的路径和后缀名。在configureMessageConverters方法中,添加了MappingJackson2HttpMessageConverter,用于将Java对象转换为JSON格式的数据。


WebMvcConfigurationSupport

@Configuration
@EnableWebMvc
public class WebMvcConfig extends WebMvcConfigurationSupport {

    @Autowired
    private MyInterceptor myInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor);
    }

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.jsp("/WEB-INF/views/", ".jsp");
    }

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(new MappingJackson2HttpMessageConverter());
    }
}

WebMvcConfigurationSupport 常用方法

/** 解决跨域问题 **/
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);
  1. 解决跨域问题:
@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
    @Override
    protected void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("*")
                .allowedHeaders("*")
                .allowCredentials(true)
                .maxAge(3600);
    }
}
  1. 添加拦截器(常用):
@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
    @Autowired
    private MyInterceptor myInterceptor;
    
    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/login");
    }
}
  1. 视图跳转控制器:
@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
    @Override
    protected void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/home").setViewName("home");
        registry.addViewController("/login").setViewName("login");
    }
}
  1. 配置视图解析器:
@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
    @Override
    protected void configureViewResolvers(ViewResolverRegistry registry) {
        registry.jsp("/WEB-INF/views/", ".jsp");
    }
}
  1. 配置内容裁决的一些选项:
@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
    @Override
    protected void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        configurer.defaultContentType(MediaType.APPLICATION_JSON)
                .mediaType("json", MediaType.APPLICATION_JSON)
                .mediaType("xml", MediaType.APPLICATION_XML);
    }
}
  1. 静态资源处理,避免静态资源被拦截(常用):

如果使用了swagger,还需要配置swagger,可参考https://blog.csdn.net/weixin_54029352/article/details/130640816

@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**")
                .addResourceLocations("classpath:/static/");
    }
}

ResourceHandlerRegistry是Spring MVC中的一个类,用于注册处理静态资源的处理器。其中,addResourceHandler方法用于添加处理静态资源的URL路径,addResourceLocations方法用于指定静态资源的存放路径。

例如,我们可以使用以下代码将静态资源的URL路径为“/static/**”(即访问静态资源时的URL前缀),静态资源存放在“/resources/”目录下:

 @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**")
                .addResourceLocations("/resources/");
    }
}

当我们访问“/static/css/style.css”时,Spring MVC会自动从“/resources/css/style.css”路径下获取该静态资源并返回给浏览器。

  1. 默认静态资源处理器:
@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
    @Override
    protected void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
}
更多推荐

【校招VIP】测试方案分析之压力测试

考点介绍:软件压力测试是校招面试里面经常会碰到的题型。基本思路是在计算机数量较少或系统资源匮乏的条件下运行测试。要求面试者了解压力测试的基本概念,压测的目的,压测的要求以及说出实例。测试方案分析之压力测试-相关题目及解析内容可点击文章末尾链接查看!一、考点试题1.软件质量管理(QM)应有质量保证(QA)和质量控制(QC

以神龙出行小程序为例,说一些网站技术

注册和登录功能:用户注册和登录可以使用手机号验证、第三方登录等方式来实现。这需要与后台服务器进行数据交互,并进行身份验证。数据存储和管理:用户的个人信息和常用地址需要进行存储和管理。这可以通过数据库来实现,如关系型数据库或NoSQL数据库。智能匹配和推荐:搬家、拉货和代驾服务需要智能匹配合适的车型和司机。这可以利用算法

QT 连接SQLServer数据库

1、安装SQLServer数据库后在SQLServer配置管理器中设置后,需要重新启动SQLServer服务2、重点*配置ODBC数据源由于没有配置ODBC,一直无法连接开始——ODBC数据源管理程序(64位)之后选择:使用用户输入登录ID和密码的SQLServer验证连接SQLServer以获得其他配置选项的默认设置

pymysql执行非查询语句会自动提交事务,关闭事务自动提交

一、前置条件在mysql数据库生成数据:CREATEDATABASEmydatabase;CREATETABLECourse(CourseIDINTPRIMARYKEY,CourseNameVARCHAR(100),InstructorVARCHAR(100),CreditsINT,StudentIDINT,FOREI

并发编程系列 - ReadWriteLock

实际工作中,为了优化性能,我们经常会使用缓存,例如缓存元数据、缓存基础数据等,这就是一种典型的读多写少应用场景。缓存之所以能提升性能,一个重要的条件就是缓存的数据一定是读多写少的,例如元数据和基础数据基本上不会发生变化(写少),但是使用它们的地方却很多(读多)。针对读多写少这种并发场景,JavaSDK并发包提供了读写锁

国家高新技术企业认定,难点解析!

2022年国家高新技术企业认定最新变化从2021年开始,国家高新技术企业认定评审将进一步从严把控,新规定体现在:1、企业申报高企当年申请或转让的专利、知识产权不予计分,知识产权获得要有延续性,如企业所有知识产权获证的时间都是同一时间段,会被质疑为临时包装,不被认可或分数极低。2、企业系统填报的软件著作权,区级组织现场考

【Python】Python 时域到频域的变换方法

Python时域到频域的变换方法时域到频域的变换方法是信号处理中一个非常重要的概念,它将时域上的信号转换为频域上的信号,方便我们对信号频率特性的分析和处理。一、傅里叶变换傅里叶变换是时域到频域转换的一种常用方法,它将时域上的信号转换成一个连续的复数函数,表示信号在各个频率上的成分。在具体的实现中,可以使用Python中

再想一想GPT

一前言花了大概两天时间看完《这就是ChatGPT》,触动还是挺大的,让我静下来,认真地想一想,是否真正理解了ChatGPT,又能给我们以什么样的启发。二思考在工作和生活中,使用ChatGPT或文心一言,逐渐形成了习惯,总想听听它们的意见。无论是小学作文还是小的编程测试例子,大部分情况下还是能够给我一个比较靠谱的意见,而

JAXB(Java Architecture for XML Binding)下载、使用

简介JAXB(JavaArchitectureforXMLBinding)就是XML数据绑定的java架构。JAXB可以根据XMLSchema生成java类,也能根据java类生成XMLSchema,XML数据绑定指定了XML请求和XML响应如何映射成java对象。JAXB提供了API和工具,可以自动在XML文档和ja

激活函数总结(四十一):激活函数补充(ShiLU、ReLUN)

激活函数总结(四十一):激活函数补充1引言2激活函数2.1ShiLU激活函数2.2ReLUN激活函数3.总结1引言在前面的文章中已经介绍了介绍了一系列激活函数(Sigmoid、Tanh、ReLU、LeakyReLU、PReLU、Swish、ELU、SELU、GELU、Softmax、Softplus、Mish、Maxo

[C++ 网络协议] 套接字和标准I/O

1.标准I/O函数的优缺点优点一:标准I/O函数具有良好的移植性。为了支持所有系统,标准I/O函数都是按照标准来定义的。适用于所有编程领域。优点二:标准I/O函数可以利用缓冲提高性能。使用标准I/O函数会得到额外的缓冲支持,当创建套接字时,操作系统将会生成一个用于I/O的缓冲,同时,当你使用标准I/O函数,将会得到另一

热文推荐