• 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");
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    HandlerInterceptor 接口的 preHandle 方法有三个参数:

    1. HttpServletRequest request:表示当前请求的 HttpServletRequest 对象,可以通过该对象获取请求的相关信息,如请求的 URL、请求的参数等。

    2. HttpServletResponse response:表示当前请求的 HttpServletResponse 对象,可以通过该对象对响应进行操作,如设置响应的状态码、设置响应的头部信息等。

    3. Object handler:表示当前请求的处理器对象,即被请求的 Controller 类的实例。可以通过该对象获取处理器的相关信息,如处理器的类名、处理器的方法名等。

    下面是一个使用代码示例:

    public class MyInterceptor implements HandlerInterceptor {
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            // 在请求处理之前执行的逻辑
            System.out.println("请求的URL:" + request.getRequestURL());
            System.out.println("请求的参数:" + request.getParameterMap());
            System.out.println("处理器的类名:" + handler.getClass().getName());
            return true; // 返回 true 表示继续执行后续的拦截器和处理器,返回 false 表示终止请求的处理
        }
        
    	Object handler参数表示当前请求所要调用的处理器(即Controller类或方法)。handler参数的类型可以有以下几种:
    	
    	1. HandlerMethod:表示当前请求要调用的Controller方法。HandlerMethodSpring MVC框架中的一个类,用于封装Controller类和方法的相关信息,如类名、方法名、参数等。
    	 
    		HandlerMethod类是Spring框架中的一个类,用于表示处理请求的方法。它包含了一些常用的方法,如下所示:
    		
    		1. `getMethod()`: 获取处理请求的方法对象。
    		
    		2. `getBean()`: 获取处理请求的方法所属的对象。
    		
    		3. `getBeanType()`: 获取处理请求的方法所属的对象的类型。
    		
    		4. `getReturnType()`: 获取处理请求的方法的返回类型。
    		
    		5. `getMethodParameters()`: 获取处理请求的方法的参数列表。
    		
    		6. `getMethodAnnotation(Class<T> annotationType)`: 获取处理请求的方法上指定类型的注解。
    		
    		7. `getMethodAnnotations()`: 获取处理请求的方法上的所有注解。
    		
    		8. `getMethodParameterAnnotations()`: 获取处理请求的方法的参数上的所有注解。
    		
    		9. `getMethodParameters()`: 获取处理请求的方法的参数列表。
    		
    		10. `getMethodParameterNames()`: 获取处理请求的方法的参数名称列表。
    	2. ResourceHttpRequestHandler:表示当前请求要调用的静态资源处理器。ResourceHttpRequestHandlerSpring MVC框架中的一个类,用于处理静态资源请求,如图片、CSSJavaScript等。
    		ResourceHttpRequestHandlerSpring MVC框架中用于处理静态资源的处理器类,常用的方法包括:
    		
    		1. setLocations(Resource... locations):设置静态资源的位置,可以传入多个Resource对象。
    		
    		2. setCacheSeconds(int cacheSeconds):设置静态资源的缓存时间,单位为秒。
    		
    		3. setUseLastModified(boolean useLastModified):设置是否使用最后修改时间来判断是否需要重新加载静态资源。
    		
    		4. setServletContext(ServletContext servletContext):设置ServletContext对象,用于获取静态资源的真实路径。
    		
    		5. handleRequest(HttpServletRequest request, HttpServletResponse response):处理静态资源请求,将静态资源输出到响应流中。
    		
    		6. getResource(HttpServletRequest request):获取请求对应的静态资源,返回Resource对象。
    		
    		7. getLastModified(HttpServletRequest request):获取请求对应的静态资源的最后修改时间,返回long类型的时间戳。
    		
    		8. isResourceNotModified(HttpServletRequest request, HttpServletResponse response, Resource resource):判断请求对应的静态资源是否需要重新加载,如果需要重新加载则返回false,否则返回true9. getResourceUrl(Resource resource, HttpServletRequest request):获取静态资源的URL地址,返回String类型的URL地址。
    		
    		10. getResourcePaths(String path):获取指定路径下的所有静态资源路径,返回Set<String>类型的路径集合。
    	3. DefaultServletHttpRequestHandler:表示当前请求要调用的默认Servlet处理器。DefaultServletHttpRequestHandlerSpring MVC框架中的一个类,用于处理默认Servlet请求,如处理静态资源的默认ServletDefaultServletHttpRequestHandlerSpring MVC框架中的一个类,用于处理静态资源的请求。它继承自HttpRequestHandlerAdapter类,并实现了HttpRequestHandler接口。下面是DefaultServletHttpRequestHandler类中常用的方法:
    		
    		1. handleRequest(HttpServletRequest request, HttpServletResponse response):处理HTTP请求并生成响应。这是HttpRequestHandler接口中定义的方法,用于处理具体的请求。
    		
    		2. setServletContext(ServletContext servletContext):设置ServletContext对象。这个方法用于设置Servlet上下文,以便在处理请求时可以访问ServletContext中的资源。
    		
    		3. setDefaultServletName(String defaultServletName):设置默认的Servlet名称。当请求的资源无法匹配到其他处理器时,会使用默认的Servlet来处理请求。
    		
    		4. setCacheSeconds(int cacheSeconds):设置缓存时间。这个方法用于设置静态资源的缓存时间,以便浏览器可以缓存资源并减少请求次数。
    		
    		5. setAlwaysUseFullPath(boolean alwaysUseFullPath):设置是否始终使用完整的路径。默认情况下,DefaultServletHttpRequestHandler会根据请求的相对路径来查找资源,如果设置为true,则始终使用完整的路径。
    		
    		这些是DefaultServletHttpRequestHandler类中常用的方法,通过调用这些方法可以对静态资源的处理进行配置和定制。
    	
    	根据不同的请求类型和配置,handler参数可能是上述三种类型之一。在preHandle方法中,可以通过判断handler参数的类型,来进行相应的处理逻辑。
    
        // 其他方法省略...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78

    在上述示例中,preHandle 方法中打印了请求的 URL、请求的参数和处理器的类名,并返回了 true,表示继续执行后续的拦截器和处理器。可以根据实际需求在 preHandle 方法中添加自己的逻辑。

    @EnableWebMvc
    @Configuration
    public class WebMvcConfig implements WebMvcConfigurer {
    
        @Autowired
        private MyInterceptor myInterceptor;
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(myInterceptor)
            	.addPathPatterns("/**")
                .excludePathPatterns("/static/**");;
        }
        
        @Override
        public void configureViewResolvers(ViewResolverRegistry registry) {
            registry.jsp("/WEB-INF/views/", ".jsp");
        }
        
        @Override
        public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
            converters.add(new MappingJackson2HttpMessageConverter());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    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());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    1. 解决跨域问题:
    @Configuration
    public class WebConfig extends WebMvcConfigurationSupport {
        @Override
        protected void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**")
                    .allowedOrigins("*")
                    .allowedMethods("*")
                    .allowedHeaders("*")
                    .allowCredentials(true)
                    .maxAge(3600);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    1. 视图跳转控制器:
    @Configuration
    public class WebConfig extends WebMvcConfigurationSupport {
        @Override
        protected void addViewControllers(ViewControllerRegistry registry) {
            registry.addViewController("/home").setViewName("home");
            registry.addViewController("/login").setViewName("login");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    1. 配置视图解析器:
    @Configuration
    public class WebConfig extends WebMvcConfigurationSupport {
        @Override
        protected void configureViewResolvers(ViewResolverRegistry registry) {
            registry.jsp("/WEB-INF/views/", ".jsp");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    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/");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

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

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

     @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/static/**")
                    .addResourceLocations("/resources/");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    当我们访问“/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();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    涨工资不是程序员跳槽的理由
    JavaScript-操作表单和前端加密
    深入了解ln命令:创建硬链接和符号链接的实用指南
    设置JVM的内存大小
    深入理解服务器路由功能:配置与应用详解
    IbBBX24–IbTOE3–IbPRX17模块通过清除甘薯中的活性氧来增强甘薯对非生物胁迫耐受性
    语音合成技术汇总1:Glow-TTS:通过单调对齐实现文本到语音的生成流
    17:57:54.359 [main] WARN com.baomidou.mybatisplus.generator.IDatabaseQuery$D
    Serialiable接口和serialVersionUID的作用及其在redisson中的应用
    计算机毕业设计——校园二手市场
  • 原文地址:https://blog.csdn.net/weixin_42594143/article/details/132965067