SpringMVC多拦截器配置

SpringMVC多拦截器配置

单个拦截器

1.创建拦截器

实现接口HandlerInterceptor,重写拦截器方法

preHandle:在Controller方法执行前执行

postHandle:在Controller方法执行后,DispatcherServlet进行视图的渲染之前执行

afterCompletion:在DispatcherServlet进行视图的渲染之后

@Slf4j
public class InterceptorOne implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String url = request.getRequestURL().toString();
        log.info("1 InterceptorOne url == " + url);
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.info("1 InterceptorOne->postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        log.info("1 InterceptorOne->afterCompletion");
    }
}

2.将拦截器注册

实现WebMvcConfigurer接口,重写addInterceptors方法

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new InterceptorOne());
    }

3.Controller测试

@RestController
public class InterceptController {

    @RequestMapping("/test")
    public String reqUrl (){
        return "success" ;
    }
}

4.执行结果

preHandle方法返回true,即成功

在这里插入图片描述

preHandle方法返回false,即失败

在这里插入图片描述

由运行结果可知,当请求被拦截时,postHandle与afterCompletion方法都不会被执行

多个拦截器

1.创建拦截器

同单个拦截器,然后额外添加两个拦截器

@Slf4j
public class InterceptorTwo implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String url = request.getRequestURL().toString();
        log.info("2 InterceptorTwo url == " + url);
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.info("2 InterceptorTwo->postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        log.info("2 InterceptorTwo->afterCompletion");
    }
}
@Slf4j
public class InterceptorThree implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String url = request.getRequestURL().toString();
        log.info("3 InterceptorThree url == " + url);
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.info("3 InterceptorThree->postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        log.info("3 InterceptorThree->afterCompletion");
    }
}

2.注册拦截器

将拦截器2和拦截器3注册

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new InterceptorOne());
        registry.addInterceptor(new InterceptorTwo());
        registry.addInterceptor(new InterceptorThree());
    }
}

3.运行结果

拦截器1,2,3的preHandle方法都返回true

在这里插入图片描述

通过运行结果可以看出多拦截器方法执行顺序为:preHandle1->preHandle2->preHandle3->postHandle3->postHandle2->postHandle1->afterCompletion3->afterCompletion2->afterCompletion1


拦截器1,2的preHandle方法返回true,拦截器3的preHandle方法返回false

在这里插入图片描述

此时,三个拦截器的postHandle方法都没有执行。说明多个拦截器只要有一个拦截器的preHandle方法没有放行,那么所有的postHandle方法都不会执行。且未放行拦截器的afterCompletion方法也不会执行。


拦截器1,3的preHandle方法返回true,拦截器2的preHandle方法返回false

在这里插入图片描述

由运行结果可知,若拦截器2的preHandle方法没有放行,那么该拦截器的下一个拦截器,即拦截器3的所有方法都不会执行。同时,拦截器2的postHandle和afterCompletion方法也都不会执行。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring MVC 配置拦截器可以通过实现 `HandlerInterceptor` 接口来创建自定义的拦截器。下面是配置拦截器的步骤: 1. 创建一个实现了 `HandlerInterceptor` 接口的拦截器类,例如: ```java public class MyInterceptor implements HandlerInterceptor { // 在请求处理之前进行调用(Controller 方法调用之前) @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 执行拦截逻辑 return true; // 返回 true 表示继续执行后续的拦截器或处理器方法,返回 false 则断后续操作 } // 在请求处理之后进行调用,但是在视图被渲染之前(Controller 方法调用之后) @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 执行拦截逻辑 } // 在整个请求结束之后被调用,也就是在 DispatcherServlet 渲染了对应的视图之后执行(主要用于资源清理操作) @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 执行拦截逻辑 } } ``` 2. 在 Spring MVC 配置文件注册拦截器,例如在 `servlet-context.xml` 文件添加以下代码: ```xml <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <!-- 拦截所有请求 --> <bean class="com.example.MyInterceptor"/> <!-- 拦截器类名 --> </mvc:interceptor> </mvc:interceptors> ``` 此配置将会拦截所有请求并应用 `MyInterceptor` 拦截器。 3. 配置完成后,当请求进入 Spring MVC 的 DispatcherServlet 时,拦截器将会按照配置的顺序执行相应的方法。 以上是使用 Spring MVC 配置拦截器的基本步骤,你可以根据实际需求自定义拦截器的逻辑和配置

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值