【开发者必备】Spring Boot 2.7.x:WebMvcConfigurer配置手册来了(三)!

关注我的公众号:【编程朝花夕拾】,可获取首发内容。

01 引言

接上一节分享的方法configureAsyncSupportconfigureDefaultServletHandling以及addFormatters。我们总共已经分享了5个方法了,我们继续分享接下的两个方法:

  • addInterceptors
  • addResourceHandlers

02 方法6

addInterceptors

java 复制代码
default void addInterceptors(InterceptorRegistry registry) {
}

作用:注册自定义拦截器,用于在请求处理前后执行特定逻辑。

使用场景

  • 权限验证
  • 日志记录
  • 性能监控
  • 跨域处理

2.1 使用说明

注册自定义拦截器,注册的拦截器有两种:

  • org.springframework.web.servlet.HandlerInterceptor
  • org.springframework.web.context.request.WebRequestInterceptor

在Spring框架中,WebRequestInterceptorHandlerInterceptor都是用于拦截请求的接口,但它们在使用和功能上有一些区别。

参数不同:

  • WebRequestInterceptorpreHandlepostHandleafterCompletion方法接收一个WebRequest参数,这个WebRequest是Spring的一个抽象,它封装了Servlet的HttpServletRequestHttpServletResponse,并且提供了一些额外的功能。
  • HandlerInterceptor的相应方法则直接接收HttpServletRequestHttpServletResponseObject(处理器对象)作为参数。

使用场景:

  • WebRequestInterceptor更侧重于对WebRequest进行操作,它不依赖于Servlet API,因此可以在非Servlet环境中使用(例如Portlet)。但是,在典型的Spring MVC应用中,我们通常使用HandlerInterceptor
  • HandlerInterceptor是Spring MVC中更常用的拦截器,它直接与Servlet API耦合,提供了更直接的访问到请求和响应对象。

功能

  • WebRequestInterceptorpreHandle方法没有返回值,因此不能中断请求,只能进行一些前置处理。而HandlerInterceptorpreHandle方法返回一个boolean值,如果返回false,则中断请求,不再执行后续的拦截器和处理器。
  • HandlerInterceptor提供了更细粒度的控制,可以在请求处理之前、之后以及完成之后(视图渲染之后)进行拦截。

用的更多的是HandlerInterceptor

2.2 定义拦截器

HandlerInterceptor

java 复制代码
@Slf4j
public class ApiInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("ApiInterceptor preHandle 执行了...");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.info("ApiInterceptor postHandle 执行了...");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        log.info("ApiInterceptor afterCompletion 执行了...");
    }
}

WebRequestInterceptor

java 复制代码
@Slf4j
public class WebApiInterceptor implements WebRequestInterceptor {
    @Override
    public void preHandle(WebRequest request) throws Exception {
        log.info("WebApiInterceptor preHandle 执行了...");
    }

    @Override
    public void postHandle(WebRequest request, ModelMap model) throws Exception {
        log.info("WebApiInterceptor postHandle 执行了...");
    }

    @Override
    public void afterCompletion(WebRequest request, Exception ex) throws Exception {
        log.info("WebApiInterceptor afterCompletion 执行了...");
    }
}

2.3 配置

java 复制代码
@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new ApiInterceptor())
            // 拦截路径
            .addPathPatterns("/**")
            // 排除路径
            .excludePathPatterns("/test/**");

    registry.addWebRequestInterceptor(new WebApiInterceptor())
            .addPathPatterns("/**")
            .excludePathPatterns("/test/**");
}

可以配置拦截的路径,也可以配置忽略的路径。

2.4 测试效果

执行的顺序和注册的顺序一致,还可以相互传递参数。但是平时开发中我们用一种就够了。

03 方法7

addResourceHandlers

java 复制代码
default void addResourceHandlers(ResourceHandlerRegistry registry) {
}

作用:配置静态资源映射路径和缓存策略。

使用场景

  • 自定义静态资源路径
  • 前端资源托管

2.1 使用说明

ResourceHandlerRegistry可操作的就是addResourceHandlersetOrder()方法,分别用来映射静态资源的路径以及顺序。

例如,静态资源的路径为:/source/1.txt,我们就需要配置ResourceHandler

java 复制代码
 registry.addResourceHandler("/source/**")

这就意味着source下面代表着静态资源。但是现在还无法访问,还需要指定静态资源的位置:

java 复制代码
 registry
     .addResourceHandler("/source/**")
     .addResourceLocations("classpath:/files/") ;			

图中为静态文件的实际位置:

2.2 配置

java 复制代码
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/source/**")
            .addResourceLocations("classpath:/files/");
}

2.3 测试效果

结果确实访问到了。但是如果不配置,就无法直接访问。

2.4 特别说明

通过源码我们能够看到SpringBoot框架开放一批静态资源可以直接访问:

  • classpath:/META-INF/resources
  • classpath:/resources/
  • classpath:/static/
  • classpath:/public/

通过测试依次访问的顺序是:

  • classpath:/META-INF/resources
  • classpath:/static/
  • classpath:/public/
  • classpath:/resources/

访问的路径不需要前缀,访问路径下的资源即可。

还可以通过配置文件追加或者修改:

properties 复制代码
spring.web.resources.static-locations=classpath:/files/

04 小结

今天介绍的这两个方法比较简单,但是非常实用,项目中会经常遇到。愿今天的分享,能够给你带来帮助,下一节我们继续介绍其他方法。

相关推荐
翻斗花园岭第一爆破手几秒前
flutter2:Container的简介与尺寸
java·服务器·前端
二十雨辰1 分钟前
[SSM]SpringMVC快速入门
java·spring
不思念一个荒废的名字4 分钟前
【黑马JavaWeb+AI知识梳理】Web后端开发05-SpringAOP
后端
Seven9711 分钟前
动态规划
java
BingoGo12 分钟前
PHP True Async 最近进展以及背后的争议
后端·php
程序员码歌14 分钟前
短思考第264天,每天复盘5分钟,胜过你盲目努力1整年(2)
前端·后端·ai编程
Victor35618 分钟前
Hibernate(3)Hibernate的优点是什么?
后端
Victor35618 分钟前
Hibernate(4)什么是Hibernate的持久化类?
后端
BF062419 分钟前
EPICS Archiver Appliance部署Quickstart方式
java·tomcat
JaguarJack21 分钟前
PHP True Async 最近进展以及背后的争议
后端·php