拦截器-Interceptor

  • 拦截器用于对URL请求进行前置/后置过滤

  • Interceptor与Filter用途相似,但实现方式不同

  • Interceptor是SpringMVC的标准组件,再被创建以后是天然的运行在Spring Ioc容器中的,Filter是J2EE的标准组件,是标准,由第三方厂商实现。

  • Interceptor底层就是基于Spring AOP面向切面编程实现。

##HandlerInterceptor接口中要实现的三个方法:

  • preHandle():请求前置执行处理

  • postHandle():目标资源已被Spring MVC框架处理,大概相当于url请求被Controller方法处理以后return但是并没有产生响应文本之前。

  • afterCompletion():响应文本已经产生

拦截器开发流程

Maven依赖servlet-api

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>

实现HandlerInterceptor接口

public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println(request.getRequestURL()+"准备执行");
        return false;//false 终止拦截器
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println(request.getRequestURL()+"目标处理成功");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println(request.getRequestURL()+"相应内容已产生");
    }
}

applicationContext配置过滤地址

<mvc:interceptors>
    <mvc:interceptor>
        <!--拦截需要拦截的URL-->
        <mvc:mapping path="/**"/>
         <!--静态资源不做拦截-->
        <mvc:exclude-mapping path="/assets/**"/>
        <!--指明那个类对拦截的URL处理-->
        <bean class="top.xiongmingcai.restful.interceptor.MyInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

拦截器使用流程 · MingCaiXiong/spring-learn@8ed911c

拦截器使用技巧

  • 如果项目中静态资源直接存放在webapp的根目录里,需要对拦截器进行设置,把静态资源排除在外:
  • 如果不想写那么多exclude-mapping
<mvc:exclude-mapping path="/assets/**"/>

多拦截器执行顺序


拦截器1在前,连接器2在后(是因为,在applicaitonContext.xml配置文件中配置拦截器时,拦截器1在前,拦截器2在后)


拦截器优先级 请求按配置顺序执行 响应逆序 · MingCaiXiong/spring-learn@9eca10a

拦截URL的区别

通常有两种配置路径的当时。/ 和/*

  • / 会匹配到/login这样的路径型url,不会匹配到模式为*.jsp这样的后缀型url 。对于需要拦截的是后台的地址,不需要拦截页面的是使用/

  • /* 会匹配所有url:是全部匹配的意思,路径型的和后缀型的url(包括/login,.jsp,.js和.html等)。

/* 和 /** 一般用来配置mvc的拦截器

  • /* : 匹配一级,即 /add , /query 等

  • /** : 匹配多级,即 /add , /add/user, /add/user/user…