SSM——SpringMVC拦截器详细介绍

SpringMVC拦截器介绍

(1)简介

(1)interceptor是springmvc提供的用来拦截请求的
(2)类似于Servlet的过滤器(Filter)。
(3)给某一些请求加一定处理。
(4)在springMVC中,所有的请求都会走到前端控制器中。拦截器配合前端控制对于某一些请求进行处理。
(5)经常用于权限验证、记录请求信息的日志、判断用户是否登录等。
(6)SpringMVC的拦截器是基于Spring AOP实现的。

(2)拦截器与过滤器的区别

filter,是javaEE 提供的用来拦截请求的,所有请求都能拦截
后者只能拦截控制器的方法
在这里插入图片描述

(3)拦截器的三个方法

HandlerInterceptor接口
执行顺序

单拦截器

(1)实现HandlerInterceptor接口

//1:实现一个接口HandlerInterceptor
public class Demo01Interceptor  implements HandlerInterceptor {
    
    
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
    
        System.out.println("preHandle");
        return true;
    }

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    
    

    }

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    
    

    }
}

(2)重写preHandle,postHandle,afterCompletion方法

在这里插入图片描述

  • preHandle
    在handler方法处理请求之前执行。该方法返回boolean类型数据,表示如果返回true,继续执行后面的方法,如果返回false,后面的方法都不会执行。
    后面的方法指的是:(1)其他的拦截器的方法(2)该拦截器的方法。(3)请求的handler方法也不会执行。
    总结:(1)如果拦截器的preHandle方法,返回false,那么其他拦截器的方法(preHandle,postHandle和afterCompletion)都不会执行。
    (2)如果拦截器的preHandle方法,返回false,该拦截器的其他方法(postHandle和afterCompletion)都不会执行。例如:请求 /offer/saveOffer , prHandle方法里面的代码会在saveOffer方法执行之前执行。
    (3)Controller中的方法也不会执行。

  • postHandle
    在handler方法处理请求之后,返回ModelAndView之前执行。

  • afterCompletion
    在完成请求之后执行。

(3)配置拦截器

在springMVC配置文件中配置。

  • (1)全局的拦截器配置
    表示拦截所有的请求。
<mvc:interceptors>
  		<!-- 配置一个全局拦截器,拦截所有请求 -->
  		<bean class="interceptor.TestInterceptor"/>
</mvc:interceptors>
  • (2)具体的路径拦截器

*配置拦截的路径
*配置执行的拦截器类。

<!-- 配置拦截器 -->
  	<mvc:interceptors>
  		<mvc:interceptor>
  			<!-- 配置拦截器作用的路径 -->
  			<mvc:mapping path="/**"/>
  			<!-- 配置不需要拦截作用的路径 -->
  			<mvc:exclude-mapping path=""/>
  			<!-- 定义在<mvc:interceptor>元素中,表示匹配指定路径的请求才进行拦截 -->
  			<bean class="interceptor.Interceptor1"/>
  		</mvc:interceptor>
  		<mvc:interceptor>
  			<!-- 配置拦截器作用的路径 -->
  			<mvc:mapping path="/gotoTest"/>
  			<!-- 定义在<mvc:interceptor>元素中,表示匹配指定路径的请求才进行拦截 -->
  			<bean class="interceptor.Interceptor2"/>
  		</mvc:interceptor>
  	</mvc:interceptors>

多拦截器

(1)什么是多拦截器

应用软件可用配置很多个拦截器,不同的拦截器实现不同一个功能。

(2)开发多拦截器

和单拦截器相同,开发多个不同功能的拦截器。不同的功能实际上指的就是拦截器对于HandlerInceptor的三个方法的实现逻辑不同。

(3)配置多拦截器

  • 配置全局的多拦截器
    在mvc:interceptors 里面配置多个Bean.
  • 配置某一路径的多拦截器
    在mvc:interceptors里面配置多个mvc:interceptor。
  • 在配置多个springMVC拦截器的时候,是有顺序的。按从上到下的顺序。

springmvc.xml

<!--拦截器使用第二步:配置拦截器-->
    <mvc:interceptors>
        <!--用于测试的拦截器-->
        <mvc:interceptor>
            <!--拦截路径的配置-->
            <mvc:mapping path="/demo05.action"/>
            <bean id="interceptor1" class="com.wzx.interceptor.Demo01Interceptor"/>
        </mvc:interceptor>
        <mvc:interceptor>
            <!--拦截路径的配置-->
            <mvc:mapping path="/demo05.action"/>
            <bean id="interceptor2" class="com.wzx.interceptor.Demo02Interceptor"/>
        </mvc:interceptor>
        <mvc:interceptor>
            <!--拦截路径的配置-->
            <mvc:mapping path="/demo05.action"/>
            <bean id="interceptor3" class="com.wzx.interceptor.Demo03Interceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

(4)多拦截器的执行流程

在这里插入图片描述
总结:

  • (1)拦截器的顺序与springMVC中配置的拦截器顺序相同。
  • (2)先执行第一个拦截器的preHandle方法。如果preHandle1返回true。执行拦截器2的preHanle2。所有的PreHandle方法执行完了以后,并且都是true,才会执行Controller的对应方法。
  • (3)Controller的方法执行完了以后,先执行后面的拦截器的posthandle方法。如上图所示,先执行postHandle2,再执行postHandle1。
  • (4)执行完所有的拦截器的postHandle方法后,controller返回ModelAndView。
  • (5)Controller处理完请求以后,再执行后面的拦截器的afterCompletion方法。如上图所示,先执行afterCompletion2,再执行afterCompletion1.

猜你喜欢

转载自blog.csdn.net/qq_41209886/article/details/109109941