WebMvcConfigurerAdapter、WebMvcConfigurer、WebMvcConfigurationSupport

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

你可能感兴趣的:(spring,boot)