温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

SpringMVC拦截器创建配置及执行顺序是什么

发布时间:2022-05-30 10:16:46 来源:亿速云 阅读:309 作者:zzz 栏目:开发技术

本文小编为大家详细介绍“SpringMVC拦截器创建配置及执行顺序是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“SpringMVC拦截器创建配置及执行顺序是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

    SpringMVC拦截器介绍

    springMVC 中的拦截器用于拦截控制器方法的执行

    先创建出前置需要的一些条件:

    <a th:href="@{/testInterceptor}" rel="external nofollow" >测试拦截器</a>

    后端:

    @Controller
    public class TestController {
     
        @RequestMapping("/testInterceptor")
        public String testInterceptor() {
            return "success";
        }
    }

    一、创建拦截器

    新建一个包 interceptors,在下面创建一个拦截器 FirstInterceptor ,并且要实现 HandlerInterceptor 接口。

    SpringMVC拦截器创建配置及执行顺序是什么

    快捷键Ctrl + O,快速重写方法,图示里的 3 个。

    public class FirstInterceptor implements HandlerInterceptor {
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("FirstInterceptor --> preHandle");
            return false;
        }
     
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("FirstInterceptor --> postHandle");
        }
     
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("FirstInterceptor --> afterCompletion");
        }
    }

    preHandle: 在当前控制器方法执行之前执行。

    postHandle: 在当前控制器方法执行之后执行。

    afterCompletion:处理完视图和模型数据,渲染视图完毕之后执行。

    二、配置拦截器

    在 springMVC 配置文件里配置拦截器,对象就是FirstInterceptor 类:

    <!-- 配置拦截器 -->
      <mvc:interceptors>
          <bean class="com.pingguo.mvc.interceptors.FirstInterceptor"></bean>
      </mvc:interceptors>

    重新部署,访问http://localhost:8080/springmvc/,发现页面空白,查看控制器日志看到有打印:

    SpringMVC拦截器创建配置及执行顺序是什么

    说明拦截成功。

    看下上面重新的三个方法中,只有preHandle有返回值,是个布尔类型:false 表示拦截true 表示放行

    修改上面preHandle的返回为 true,重新部署后再次访问首页,可以访问成功。

    SpringMVC拦截器创建配置及执行顺序是什么

    查看控制台打印输出,看到在渲染之前,前面2个方法执行了:preHandlepostHandle

    SpringMVC拦截器创建配置及执行顺序是什么

    在非常多的 Thymeleaf 渲染之后,最后一个 afterCompletion 也执行了。

    SpringMVC拦截器创建配置及执行顺序是什么

    现在继续点击首页里的新加的超链接,发现也会被拦截放行。

    SpringMVC拦截器创建配置及执行顺序是什么

    说明这种配置方式,会拦截所有的请求

    设置不需要拦截的请求

    可以通过 ref 或 bean 标签设置拦截器:

    • 通过mvc:mapping设置需要拦截的请求通过

    • mvc:exclude-mapping设置需要排除的请求

    <bean name="firstInterceptor" class="com.pingguo.mvc.interceptors.FirstInterceptor"></bean>
        <!-- 配置拦截器 -->
        <mvc:interceptors>
            <mvc:interceptor>
                <mvc:mapping path="/**"/>
                <mvc:exclude-mapping path="/"></mvc:exclude-mapping>
                <ref bean="firstInterceptor"></ref>
            </mvc:interceptor>
        </mvc:interceptors>

    注意这里我在外部注册了一个 bean 叫 firstInterceptor,以便 ref 引用。

    • <mvc:mapping path="/**"/>,表示拦截所有请求。

    • <mvc:exclude-mapping path="/">,表示除了首页不拦截。

    也就是说,现在我访问http://localhost:8080/springmvc/的时候,应该不拦截。访问http://localhost:8080/springmvc/testInterceptor就会拦截了。

    试一下,先访问 http://localhost:8080/springmvc/

    可以正常打开首页,并且控制台也没有输出拦截器里的内容:

    SpringMVC拦截器创建配置及执行顺序是什么

    现在继续访问 http://localhost:8080/springmvc/testInterceptor

    SpringMVC拦截器创建配置及执行顺序是什么

    拦截了。

    三、多个拦截器的执行顺序

    继续新建一个拦截器SecondInterceptor,注意这次我加了 @Component,方便在配置文件中直接ref引用使用。

    @Component
    public class SecondInterceptor implements HandlerInterceptor {
     
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("SecondInterceptor --> preHandle");
            return true;
        }
     
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("SecondInterceptor --> postHandle");
        }
     
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("SecondInterceptor --> afterCompletion");
        }
    }

    修改拦截器配置:

    <!-- 配置拦截器 -->
        <mvc:interceptors>
            <ref bean="firstInterceptor"></ref>
            <ref bean="secondInterceptor"></ref>
        </mvc:interceptors>

    重新部署,访问下首页http://localhost:8080/springmvc/,查看控制台打印输出。

    SpringMVC拦截器创建配置及执行顺序是什么

    可以发现,preHandle 方法执行的顺序是 FirstInterceptor->SecondInterceptor。其他 2 个方法则是顺序倒过来。

    若每个拦截器的 preHandle()都返回 true:

    • 执行顺序跟配置里的顺序有关,在上面拦截器里 firstInterceptor 就是在 secondInterceptor前面。

    • preHandle()会按照配置的顺序执行,而postHandle()和afterComplation()`会按照配置的反序执行。

    若某个拦截器的preHandle()返回了false:

    • preHandle()返回false和它之前的拦截器的preHandle()都会执行。

    • postHandle()都不执行。

    • 返回false的拦截器之前的拦截器的afterComplation()会执行。

    试一下,把 SecondInterceptor 中的preHandle()修改返回 false,再次请求下首页:

    SpringMVC拦截器创建配置及执行顺序是什么

    符合预期。

    读到这里,这篇“SpringMVC拦截器创建配置及执行顺序是什么”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI