springmvc中WebMvcConfigurationSupport中addInterceptor使用详解及方法详解

1. addInterceptor简介

在Spring MVC中,WebMvcConfigurationSupport是一个类,可以通过继承它来进行自定义的MVC配置。在这个类中,可以使用addInterceptor方法来添加拦截器到请求处理链中。

下面是关于addInterceptor方法的说明:

java复制代码protected void addInterceptor(InterceptorRegistry registry)
  • addInterceptor方法是WebMvcConfigurationSupport中的方法之一,用于添加拦截器。
  • 在子类中重写这个方法,可以向注册表(InterceptorRegistry)中添加拦截器。
  • 通过注册表,可以指定拦截器要拦截的路径、优先级等信息。

总之,addInterceptors(InterceptorRegistry registry):用于注册拦截器。我们可以通过重写这个方法,将自定义的拦截器添加到 registry 中。

2. InterceptorRegistry 方法详解

2.1 addPathPatterns(String… patterns)

通过这个方法,我们可以指定要拦截的请求路径模式,使拦截器只对符合指定路径模式的请求进行拦截。

以下是关于 addPathPatterns 方法的说明:

  • addPathPatterns 方法接受一个或多个字符串参数作为路径模式。
  • 路径模式可以使用通配符来匹配多个路径,例如 "/*" 表示根路径和其子路径都会被拦截。
  • 该方法可以在添加拦截器时使用,用于指定需要被拦截器处理的路径。
  • 拦截的路径模式将被应用于已经设置的拦截路径上。
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new CustomInterceptor())
                .addPathPatterns("/api/**"); // 拦截 /api 下的所有请求
    }

在上面的示例中,首先通过 addInterceptor 方法添加了一个自定义拦截器 CustomInterceptor,然后使用 addPathPatterns 方法指定了要拦截的路径模式 /api/**

这样配置之后,拦截器将会对所有以 /api/ 开头的请求进行拦截处理。

通过使用 addPathPatterns 方法,我们可以更加细粒度地指定拦截器的应用范围,根据具体需求选择性地拦截某些路径。如果不调用 addPathPatterns 方法,则拦截器将对所有请求生效。

2.2 addPathPatterns(List patterns)

通过这个方法,我们可以指定要拦截的请求路径模式列表,使拦截器只对符合指定路径模式的请求进行拦截。

以下是关于 addPathPatterns 方法的说明:

  • addPathPatterns 方法接受一个字符串列表作为路径模式。

  • 路径模式可以使用通配符来匹配多个路径,例如 "/*" 表示根路径和其子路径都会被拦截。

  • 该方法可以在添加拦截器时使用,用于指定需要被拦截器处理的路径。

  • 拦截的路径模式将被应用于已经设置的拦截路径上。

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new CustomInterceptor())
                .addPathPatterns(Arrays.asList("/api/**", "/admin/**")); // 拦截 /api 和 /admin 下的所有请求
    }

在上面的示例中,首先通过 addInterceptor 方法添加了一个自定义拦截器 CustomInterceptor,然后使用 addPathPatterns 方法传入一个路径模式列表,包含了要拦截的路径模式 "/api/**""/admin/**"

这样配置之后,拦截器将会对所有以 /api//admin/ 开头的请求进行拦截处理。

通过使用 addPathPatterns 方法,我们可以更加灵活地指定拦截器的应用范围,根据具体需求选择性地拦截某些路径。如果不调用 addPathPatterns 方法,则拦截器将对所有请求生效。

2.3 excludePathPatterns(String… patterns)

通过这个方法,我们可以指定要排除(不拦截)的请求路径模式,使拦截器不对这些路径的请求进行拦截。

以下是关于 excludePathPatterns 方法的说明:

  • excludePathPatterns 方法接受一个或多个字符串参数作为路径模式。
  • 路径模式可以使用通配符来匹配多个路径,例如 "/*" 表示根路径和其子路径都会被排除。
  • 该方法可以在添加拦截器时使用,用于指定哪些路径不需要被拦截器处理。
  • 排除的路径模式将被应用于已经设置的拦截路径上。
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new CustomInterceptor())
                .addPathPatterns("/api/**") // 拦截 /api 下的所有请求
                .excludePathPatterns("/api/public/**"); // 排除 /api/public 下的请求
    }

在上面的示例中,首先通过 addInterceptor 方法添加了一个自定义拦截器 CustomInterceptor,然后使用 addPathPatterns 方法指定了要拦截的路径模式 /api/**,接着使用 excludePathPatterns 方法指定了要排除的路径模式 /api/public/**

这样配置之后,拦截器将会对所有以 /api/ 开头的请求进行拦截,但是会排除以 /api/public/ 开头的请求,即不会对这些请求进行拦截处理。

通过使用 excludePathPatterns 方法,我们可以更加细粒度地控制拦截器的应用范围,根据具体需求选择性地排除某些路径。

2.4 excludePathPatterns(List patterns)

通过这个方法,我们可以指定要排除(不拦截)的请求路径模式列表,使拦截器不对这些路径的请求进行拦截。

以下是关于 excludePathPatterns 方法的说明:

  • excludePathPatterns 方法接受一个字符串列表作为路径模式。
  • 路径模式可以使用通配符来匹配多个路径,例如 "/*" 表示根路径和其子路径都会被排除。
  • 该方法可以在添加拦截器时使用,用于指定哪些路径不需要被拦截器处理。
  • 排除的路径模式将被应用于已经设置的拦截路径上。
@Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new CustomInterceptor())
                .addPathPatterns("/api/**") // 拦截 /api 下的所有请求
                .excludePathPatterns(Arrays.asList("/api/public/**", "/api/open/**")); // 排除 /api/public 和 /api/open 下的请求
    }

在上面的示例中,首先通过 addInterceptor 方法添加了一个自定义拦截器 CustomInterceptor,然后使用 addPathPatterns 方法指定了要拦截的路径模式 /api/**,接着使用 excludePathPatterns 方法传入一个排除的路径模式列表,包含了要排除的路径模式 "/api/public/**""/api/open/**"

这样配置之后,拦截器将会对所有以 /api/ 开头的请求进行拦截,但是会排除以 /api/public//api/open/ 开头的请求,即不会对这些请求进行拦截处理。

通过使用 excludePathPatterns 方法,我们可以更加细粒度地控制拦截器的应用范围,根据具体需求选择性地排除某些路径。如果不调用 excludePathPatterns 方法,则拦截器将对所有符合拦截路径模式的请求生效。

2.5 pathMatcher(PathMatcher pathMatcher)

该方法用于设置拦截器注册表使用的路径匹配器(PathMatcher)。

以下是关于 pathMatcher(PathMatcher pathMatcher) 方法的说明:

  • pathMatcher(PathMatcher pathMatcher) 方法接受一个 PathMatcher 对象作为参数,用于设置拦截器注册表使用的路径匹配器。

  • 路径匹配器(PathMatcher)用于判断请求路径是否与设置的路径模式匹配。

  • 默认情况下,Spring MVC 使用的是 Ant 风格的路径匹配器 AntPathMatcher

  • 可以通过自定义实现 PathMatcher 接口来创建自己的路径匹配器,例如使用正则表达式等。

  • 通过设置路径匹配器,可以控制拦截器对请求路径的匹配方式。

        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new CustomInterceptor())
                    .addPathPatterns("/api/**")
                    .excludePathPatterns("/api/public/**")
                    .pathMatcher(new RegexPathMatcher()); // 设置自定义的路径匹配器或者使用AntPathMatcher
        }
    

    在上述示例中,首先通过 addInterceptor 方法添加了一个自定义拦截器 CustomInterceptor,然后使用 addPathPatterns 方法指定了要拦截的路径模式 /api/**,使用 excludePathPatterns 方法指定了要排除的路径模式 /api/public/**,最后使用 pathMatcher 方法传入了一个自定义的路径匹配器 RegexPathMatcher

    通过设置自定义的路径匹配器,我们可以根据具体需求更灵活地控制拦截器对请求路径的匹配方式。

2.6 order(int order)

它用于设置拦截器的执行顺序。参数是一个整数值,表示侦听器的优先级或执行顺序。order(int order)``InterceptorRegistry``order

在 Spring 中,拦截器根据其分配的订单值以特定顺序执行。首先执行具有较低阶值的拦截器,然后执行具有较高阶值的拦截器。这允许您控制将侦听器应用于请求的顺序。

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        MyInterceptor myInterceptor = new MyInterceptor();
        registry.addInterceptor(myInterceptor)
                .addPathPatterns("/api/**")
                .order(1); // Set the order to 1
    }

在此示例中,对于与“/api/**”模式匹配的请求,将以 1 的顺序执行。如果您有多个拦截器,则可以分配不同的订单值来控制其执行顺序。MyInterceptor

请务必注意,如果没有为拦截器显式设置顺序,则会为其分配默认订单值 ,这意味着它将在拦截器链中最后执行。Ordered.LOWEST_PRECEDENCE

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java拦截器是在请求到达目标方法之前或之后,对请求进行拦截、处理或修改的一种机制。在SpringMVC,可以通过实现HandlerInterceptor接口来编写拦截器。 下面是一个实现拦截器的示例: 1. 创建一个类实现HandlerInterceptor接口,并实现其三个方法:preHandle、postHandle和afterCompletion。 ```java public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 在请求处理之前进行调用(Controller方法调用之前) System.out.println("拦截器 preHandle 方法被调用"); return true; // 只有返回true才会继续向下执行,返回false取消当前请求 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后) System.out.println("拦截器 postHandle 方法被调用"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 在整个请求结束之后被调用,也就是在DispatcherServlet渲染了对应的视图之后执行(主要用于进行资源清理工作) System.out.println("拦截器 afterCompletion 方法被调用"); } } ``` 2. 在SpringMVC的配置文件配置拦截器。 ```xml <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.example.MyInterceptor"/> </mvc:interceptor> </mvc:interceptors> ``` 上述代码,将拦截器配置为对所有请求进行拦截。也可以根据需要进行配置。 通过以上配置,拦截器就可以在请求到达Controller之前、之后和整个请求结束后执行相应的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值