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 接口。

快捷键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/,发现页面空白,查看控制器日志看到有打印:

说明拦截成功。

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

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

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

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

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

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

设置不需要拦截的请求

可以通过 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/

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

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

拦截了。

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

继续新建一个拦截器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/,查看控制台打印输出。

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

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

  • 执行顺序跟配置里的顺序有关,在上面拦截器里 firstInterceptor 就是在 secondInterceptor前面。
  • preHandle()会按照配置的顺序执行,而postHandle()和afterComplation()`会按照配置的反序执行。

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

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

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

符合预期。

这些过程可以打断点看下源码的执行过程。

以上就是SpringMVC拦截器创建配置及执行顺序的详细内容,更多关于SpringMVC拦截器配置的资料请关注我们其它相关文章!

(0)

相关推荐

  • SpringMVC中的拦截器详解及代码示例

    本文研究的主要是SpringMVC中的拦截器的介绍及实例代码,配置等内容,具体如下. Springmvc的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理.本文主要总结一下springmvc中拦截器是如何定义的,以及测试拦截器的执行情况和使用方法. 1. springmvc拦截器的定义和配置 1.1 springmvc拦截器的定义 在springmvc中,定义拦截器要实现HandlerInterceptor接口,并实现该接口中提供的三个方法,如下: /

  • SpringMVC拦截器详解

    目录 web.xml文件 springMVC配置文件: controller类: 第一个拦截器配置: 第二个拦截器: 总结 web.xml文件 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-inst

  • 简单总结SpringMVC拦截器的使用方法

    SpringMVC拦截器 拦截器类似于Filter过滤器,它是springMVC特有的,它可以预处理和后处理,我们可以定义一些拦截器来实现特定的业务. 过滤器与拦截器本质区别: (1)拦截器时AOP思想的具体应用(一个横切面,直接切进请求响应中去). (2)拦截器时spring MVC特有的. (3)拦截器只会拦截 访问控制器的方法,如果访问静态资源如:.jsp/html/css/image/js 时,它不会去拦截,而Filter过滤器无论什么都会去拦截. 自定义拦截器需要两步: 第一步:编写自

  • 详解利用SpringMVC拦截器控制Controller返回值

    背景:需求是在Controller中方法没有实现时,返回模拟结果.主要用于项目初期前台跟后台的交互,Web项目就是在前台发出请求然后后台响应并返回结果.本示例利用拦截器和注解实现跳过执行方法直接返回定义结构的功能. 通过定义一个StringResult注解,在访问方法的时候返回StringResult中的内容.通过Debug注解来定义方法是否要返回StringResult中的内容. Debug默认为TRUE package com.tiamaes.dep.annotation; import j

  • SpringMVC中拦截器的实现

    SpringMVC 中的 Interceptor 拦截器是非常重要和相当有用的,它的主要作用是拦截指定的用户请求,并进行相应的预处理与后处理.其拦截的时间点在“处理器映射器根据用户提交的请求映射出了所要执行的处理器类,并且也找到了要执行该处理器类的处理器适配器,在处理器适配器执行处理器之前”.当然,在处理器映射器映射出所要执行的处理器类时,已经将拦截器与处理器组合为了一个处理器执行链,并返回给了中央调度器. 拦截器和过滤器很像,但是又有比较大的区别 过滤器是servlet规范的一部分,任何jav

  • java SpringMvc中拦截器的应用

    目录 什么是拦截器 基本使用 实例 总结 什么是拦截器 拦截器(Interceptor)是SpringMVC中的组件.可以使很多个请求被处理时,都会执行拦截器中的代码.拦截器可以选择阻止执行或放行. 举个栗子: 基本使用 在SpringMVC中实现HandlerInteceptor拦截器接口,这个类就是一个拦截器类. 利用拦截器最核心的在用控制preHandle方法的返回值,返回true就成功了,返回false就表示进行拦截处理了. 实例 首先,创建一个类继承拦截器 public class D

  • SpringMVC拦截器创建配置及执行顺序

    目录 SpringMVC拦截器介绍 一.创建拦截器 二.配置拦截器 设置不需要拦截的请求 三.多个拦截器的执行顺序 SpringMVC拦截器介绍 springMVC 中的拦截器用于拦截控制器方法的执行. 先创建出前置需要的一些条件: <a th:href="@{/testInterceptor}" rel="external nofollow" >测试拦截器</a> 后端: @Controller public class TestContr

  • 零基础入门SpringMVC拦截器的配置与使用

    在SpringMVC中 我们说到了拦截器 , 它会在映射处理器(HandleMapping)执行时检查我们访问的地址是否配置拦截器 , 在拦截器中实现一些功能 SpringMVC 定义了拦截器接口 HandlerInterceptor该接口中定义了三个方法,这三个方法的调用时在 SpringMVC 框架内部完成的, 调用这个三个方法的时候,其参数的值也是从框架内部传递进来的. 首先我们来看第一个方法 : boolean preHandle() 预处理方法,实现处理器(Controller层, 控

  • Springmvc拦截器执行顺序及各方法作用详解

    实现HandlerInterceptor接口或者继承HandlerInterceptor的子类,比如Spring 已经提供的实现了HandlerInterceptor 接口的抽象类HandlerInterceptorAdapter ,下面讲实现其接口的写法,先看一下这个接口的三个方法. - 方法preHandle: 顾名思义,该方法将在请求处理之前进行调用,在controller之前执行.SpringMVC 中的Interceptor 是链式的调用的,在一个应用中或者说是在一个请求中可以同时存在

  • 详解SpringMVC拦截器配置及使用方法

    本文介绍了SpringMVC拦截器配置及使用方法,分享给大家,具体如下: 常见应用场景 1.日志记录:记录请求信息的日志,以便进行信息监控.信息统计.计算PV(Page View)等. 2.权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面: 3.性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache可以自动记录): 4.通用行为:读取cookie得到用户信

  • 详解SpringMVC的拦截器参数及拦截器链配置

    目录 一.拦截器参数 二.拦截器链配置 一.拦截器参数 前置处理 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("preHandle..."); return true; } 参数: ■ request:请求对象 ■ response:响应对象 ■ handle

  • 详解SpringMVC的拦截器链实现及拦截器链配置

    目录 1.拦截器链实现 2.拦截器链的执行顺序 1.拦截器链实现 只需定义多个拦截器的 bean,然后在拦截器的配置类中将其逐一添加即可 第一个拦截器的定义: @Component public class ProjectInterceptor1 implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, O

  • Java SpringMVC拦截器与异常处理机制详解分析

    目录 拦截器(interceptor)的作用 拦截器快速入门 案例:用户登录权限控制 拦截器方法说明 SpringMVC异常处理 异常处理的思路 异常处理两种方式 拦截器(interceptor)的作用 Spring MVC的拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理. 将拦截器按一定的顺序联结成一条链,这条链称为拦截器链(Interceptor Chain).在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用.拦截器也是AOP思

  • Java 超详细讲解SpringMVC拦截器

    目录 拦截器(interceptor)的作用 拦截器和过滤器区别 拦截器快速入门 多拦截器操作 拦截器方法说明 本章小结 拦截器(interceptor)的作用 Spring MVC 的 拦截器 类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行 预处理 和 后处理 . 将拦截器按一定的顺序联结成一条链,这条链称为 拦截器链(Interceptor Chain) .在访问被拦截的方 法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用.拦截器也是AOP思想的具体实现.

  • SpringMVC拦截器快速掌握下篇

    目录 拦截器参数 前置处理方法 后置处理方法 完成处理方法 拦截器链配置 配置多个拦截器 创建拦截器类 配置拦截器类 拦截器参数 前置处理方法 原始方法之前运行preHandle public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("preHandle"); retu

  • SpringMVC拦截器快速掌握上篇

    目录 什么是拦截器 拦截器入门案例 环境准备 拦截器开发 简化SpringMvcSupport的编写 总结 什么是拦截器 讲解拦截器的概念之前,我们先看一张图: (1)浏览器发送一个请求会先到Tomcat的web服务器 (2)Tomcat服务器接收到请求以后,会去判断请求的是静态资源还是动态资源 (3)如果是静态资源,会直接到Tomcat的项目部署目录下去直接访问 (4)如果是动态资源,就需要交给项目的后台代码进行处理 (5)在找到具体的方法之前,我们可以去配置过滤器(可以配置多个),按照顺序进

随机推荐